1 /***
2 * Redistribution and use of this software and associated documentation
3 * ("Software"), with or without modification, are permitted provided
4 * that the following conditions are met:
5 *
6 * 1. Redistributions of source code must retain copyright
7 * statements and notices. Redistributions must also contain a
8 * copy of this document.
9 *
10 * 2. Redistributions in binary form must reproduce the
11 * above copyright notice, this list of conditions and the
12 * following disclaimer in the documentation and/or other
13 * materials provided with the distribution.
14 *
15 * 3. The name "Exolab" must not be used to endorse or promote
16 * products derived from this Software without prior written
17 * permission of Exoffice Technologies. For written permission,
18 * please contact info@exolab.org.
19 *
20 * 4. Products derived from this Software may not be called "Exolab"
21 * nor may "Exolab" appear in their names without prior written
22 * permission of Exoffice Technologies. Exolab is a registered
23 * trademark of Exoffice Technologies.
24 *
25 * 5. Due credit should be given to the Exolab Project
26 * (http://www.exolab.org/).
27 *
28 * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS
29 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
32 * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39 * OF THE POSSIBILITY OF SUCH DAMAGE.
40 *
41 * Copyright 2000-2003 (C) Exoffice Technologies Inc. All Rights Reserved.
42 *
43 * $Id: IpcJmsSessionConnection.java,v 1.28 2003/08/30 07:58:51 tanderson Exp $
44 *
45 * Date Author Changes
46 * $Date jimm Created
47 */
48 package org.exolab.jms.server.mipc;
49
50 import java.io.Serializable;
51 import java.util.Vector;
52
53 import javax.jms.JMSException;
54 import javax.jms.Message;
55 import javax.transaction.xa.XAException;
56 import javax.transaction.xa.XAResource;
57 import javax.transaction.xa.Xid;
58
59 import org.apache.commons.logging.Log;
60 import org.apache.commons.logging.LogFactory;
61
62 import org.exolab.core.ipc.NotifierIfc;
63 import org.exolab.core.mipc.MultiplexConnectionIfc;
64 import org.exolab.jms.client.JmsQueue;
65 import org.exolab.jms.client.JmsTopic;
66 import org.exolab.jms.message.MessageImpl;
67 import org.exolab.jms.server.JmsServerConnection;
68 import org.exolab.jms.server.JmsServerConnectionManager;
69 import org.exolab.jms.server.JmsServerSession;
70
71
72 /***
73 * This is the server side receiver for JmsSession requests. All requests are
74 * unpacked and passed on to the appropriate JmsServerSession object.
75 *
76 * @version $Revision: 1.28 $ $Date: 2003/08/30 07:58:51 $
77 * @author <a href="mailto:mourikis@exolab.org">Jim Mourikis</a>
78 * @see org.exolab.jms.server.mipc.IpcJmsReceiver
79 * @see org.exolab.jms.server.JmsServerConnection
80 * @see org.exolab.jms.server.JmsServerConnectionManager
81 * @see org.exolab.jms.server.JmsServerSession
82 */
83 public class IpcJmsSessionConnection implements NotifierIfc {
84
85 /***
86 * The server
87 */
88 private IpcJmsServer _server;
89
90 /***
91 * The logger
92 */
93 private static final Log _log =
94 LogFactory.getLog(IpcJmsSessionConnection.class);
95
96
97 /***
98 * Construct a new <code>IpcJmsSessionConnection</code>
99 *
100 * @param server the server instance
101 */
102 public IpcJmsSessionConnection(IpcJmsServer server) {
103 _server = server;
104 }
105
106 /***
107 * A new request has been received.
108 * Carry out the request, and pass back any relevent data.
109 *
110 * @param ob The data received
111 * @param id The unique IPC id of the connection
112 * @param The unique identifier of this connection.
113 * @return Object Return any requested result. This must never be null.
114 *
115 */
116 public Serializable notify(Object ob, String id) {
117 Vector v = (Vector) ob;
118 String func = (String) v.get(1);
119 JmsServerSession session = getSession(id, v);
120 Serializable result = null;
121 if (session == null) {
122 JMSException error = new JMSException(
123 "Failed to process request " + func
124 + ": session not found");
125 result = pack(Boolean.FALSE, error);
126 } else {
127 if (func.equals("close")) {
128 result = close(session, getConnection(id));
129 } else if (func.equals("acknowledgeMessage")) {
130 result = acknowledgeMessage(session, (Long) v.get(5),
131 (String) v.get(6));
132 } else if (func.equals("sendMessage")) {
133 result = sendMessage(session, (Message) v.get(5));
134 } else if (func.equals("sendMessages")) {
135 result = sendMessages(session, (Vector) v.get(5));
136 } else if (func.equals("receiveMessage")) {
137 result = receiveMessage(session, (Long) v.get(5),
138 (Long) v.get(6));
139 } else if (func.equals("receiveMessages")) {
140 result = receiveMessages(session, (Long) v.get(5),
141 (Integer) v.get(6));
142 } else if (func.equals("createQueue")) {
143 result = createQueue(session, (JmsQueue) v.get(5));
144 } else if (func.equals("createTopic")) {
145 result = createTopic(session, (JmsTopic) v.get(5));
146 } else if (func.equals("createReceiver")) {
147 result = createReceiver(
148 session, (JmsQueue) v.get(5), (Long) v.get(6),
149 (String) v.get(7), getConnection(id), (String) v.get(8),
150 (String) v.get(9), (String) v.get(10));
151 } else if (func.equals("createSender")) {
152 result = createSender(session, (JmsQueue) v.get(5));
153 } else if (func.equals("createBrowser")) {
154 result = createBrowser(
155 session, (JmsQueue) v.get(5), (Long) v.get(6),
156 (String) v.get(7), getConnection(id), (String) v.get(8),
157 (String) v.get(9), (String) v.get(10));
158 } else if (func.equals("deleteReceiver")) {
159 result = deleteReceiver(session, (Long) v.get(5));
160 } else if (func.equals("deleteSender")) {
161 result = deleteSender(session, (Long) v.get(5));
162 } else if (func.equals("deleteBrowser")) {
163 result = deleteBrowser(session, (Long) v.get(5));
164 } else if (func.equals("createSubscriber")) {
165 result = createSubscriber(
166 session, (JmsTopic) v.get(5), (String) v.get(6),
167 (Long) v.get(7), (String) v.get(8), (Boolean) v.get(9),
168 getConnection(id), (String) v.get(10), (String) v.get(11),
169 (String) v.get(12));
170 } else if (func.equals("createPublisher")) {
171 result = createPublisher(session, (JmsTopic) v.get(5));
172 } else if (func.equals("deleteSubscriber")) {
173 result = deleteSubscriber(session, (Long) v.get(5));
174 } else if (func.equals("deletePublisher")) {
175 result = deletePublisher(session, (JmsTopic) v.get(5));
176 } else if (func.equals("unsubscribe")) {
177 result = unsubscribe(session, (String) v.get(5));
178 } else if (func.equals("stopMessageDelivery")) {
179 result = stopMessageDelivery(session);
180 } else if (func.equals("startMessageDelivery")) {
181 result = startMessageDelivery(session);
182 } else if (func.equals("recover")) {
183 result = recover(session);
184 } else if (func.equals("commit")) {
185 result = commit(session);
186 } else if (func.equals("rollback")) {
187 result = rollback(session);
188 } else if (func.equals("xa_commit")) {
189 result = XACommit(session, (Xid) v.get(5), (Boolean) v.get(6));
190 } else if (func.equals("xa_end")) {
191 result = XAEnd(session, (Xid) v.get(5), (Integer) v.get(6));
192 } else if (func.equals("xa_forget")) {
193 result = XAForget(session, (Xid) v.get(5));
194 } else if (func.equals("xa_getTransactionTimeout")) {
195 result = XAGetTransactionTimeout(session);
196 } else if (func.equals("xa_recover")) {
197 result = XARecover(session, (Integer) v.get(5));
198 } else if (func.equals("xa_rollback")) {
199 result = XARollback(session, (Xid) v.get(5));
200 } else if (func.equals("xa_setTransactionTimeout")) {
201 result = XASetTransactionTimeout(session, (Integer) v.get(5));
202 } else if (func.equals("xa_start")) {
203 result = XAStart(session, (Xid) v.get(5), (Integer) v.get(6));
204 } else if (func.equals("xa_prepare")) {
205 result = XAPrepare(session, (Xid) v.get(5));
206 } else if (func.equals("xa_getResourceManagerId")) {
207 result = XAGetResourceManagerId(session);
208 } else if (func.equals("enableAsynchronousDelivery")) {
209 result = enableAsynchronousDelivery(
210 session, (Long) v.get(5), (String) v.get(6),
211 (Boolean) v.get(7));
212 } else {
213 JMSException error = new JMSException(
214 "Unknown request received: " + func);
215 result = pack(Boolean.FALSE, error);
216 }
217 }
218
219 return result;
220 }
221
222 /***
223 * The connection has been broken.
224 *
225 * @param id The unique identifier of this connection.
226 */
227 public void disconnection(String id) {
228 }
229
230 /***
231 * A convenience routine to get the session.
232 *
233 * @param id The unique IPC id of the connection
234 * @param v The vector containing the packed data from the client.
235 * @return JmsServerSession The required session or null if not found.
236 *
237 */
238 protected JmsServerSession getSession(String id, Vector v) {
239 // Lookup the connection using the unique connection id
240 JmsServerConnection connection =
241 JmsServerConnectionManager.instance().getConnection
242 ((String) v.get(2));
243
244 JmsServerSession session = null;
245
246 if (connection != null) {
247 session = connection.getSession((String) v.get(4));
248 } else if (_log.isDebugEnabled()) {
249 _log.debug("Failed to locate connection=" + v.get(2));
250 }
251 if (session == null && _log.isDebugEnabled()) {
252 _log.debug("Failed to locate session=" + v.get(4));
253 }
254
255 return session;
256 }
257
258 /***
259 * A convenience routine to get the MutliplexConnection.
260 *
261 * @param id The unique IPC id of the connection
262 * @return MultiplexConnection The connection associated with the ipc channel.
263 *
264 */
265 protected MultiplexConnectionIfc getConnection(String id) {
266 IpcServerChannel channel = IpcServerChannel.getServerChannel(id);
267 MultiplexConnectionIfc mc = null;
268 if (channel != null) {
269 mc = channel.getConnection();
270 }
271 return mc;
272 }
273
274 /***
275 * A close session request has been received.
276 *
277 * @param session The session to close
278 * @return Vector The result of the request.
279 *
280 */
281 protected Vector close(JmsServerSession session,
282 MultiplexConnectionIfc connection) {
283 try {
284 _server.removeConnection(session, connection);
285 session.close();
286 } catch (JMSException exception) {
287 return pack(Boolean.FALSE, exception);
288 }
289
290 return pack(Boolean.TRUE, null);
291 }
292
293 /***
294 * Acknowledge a JmsMessage
295 *
296 * @param session - the session the request is for
297 * @param clientId - the identity of the client that sent it
298 * @param id The id of the message
299 * @return Vector The result of the request.
300 *
301 */
302 protected Vector acknowledgeMessage(JmsServerSession session,
303 Long clientId, String id) {
304 try {
305 session.acknowledgeMessage(clientId.longValue(), id);
306 } catch (JMSException exception) {
307 return pack(Boolean.FALSE, exception);
308 }
309
310 return pack(Boolean.TRUE, null);
311 }
312
313 /***
314 * A JmsMessage has been sent.
315 *
316 * @param session The session the request is for.
317 * @param message The message to process.
318 * @return Vector The result of the request.
319 *
320 */
321 protected Vector sendMessage(JmsServerSession session, Message message) {
322 boolean persistent = ((MessageImpl) message).isPersistent();
323
324 try {
325 session.sendMessage(message);
326 } catch (JMSException exception) {
327 return pack(Boolean.FALSE, exception);
328 }
329
330 if (persistent) {
331 return pack(Boolean.TRUE, null);
332 }
333 // non-persistent messages do not need to send back anything.
334 return null;
335 }
336
337 /***
338 * A collection of messages have been sent
339 *
340 * @param session - the session the request is for.
341 * @param messages - the messages to process.
342 * @return Vector - the result of the request.
343 *
344 */
345 protected Vector sendMessages(JmsServerSession session, Vector messages) {
346 try {
347 session.sendMessages(messages);
348 } catch (JMSException exception) {
349 return pack(Boolean.FALSE, exception);
350 }
351
352 return pack(Boolean.TRUE, null);
353 }
354
355 /***
356 * Receive a message from the provider
357 *
358 * @param session The session the request is for.
359 * @param clientId The client identity
360 * @param wait How long to wait
361 * @return Vector The result of the request.
362 *
363 */
364 protected Vector receiveMessage(JmsServerSession session, Long clientId,
365 Long wait) {
366 Message message = null;
367 try {
368 message = session.receiveMessage(clientId.longValue(),
369 wait.longValue());
370 } catch (JMSException exception) {
371 return pack(Boolean.FALSE, exception);
372 }
373
374 return pack(Boolean.TRUE, message);
375 }
376
377
378 /***
379 * Receive upto count messages from the endpoint
380 *
381 * @param session - the session the request is for.
382 * @param clientId - the client identity
383 * @param count - max number of messages to receive
384 * @return Vector - the result of the request.
385 *
386 */
387 protected Vector receiveMessages(JmsServerSession session, Long clientId,
388 Integer count) {
389 Vector messages = null;
390 try {
391 messages = session.receiveMessages(clientId.longValue(),
392 count.intValue());
393 } catch (JMSException exception) {
394 return pack(Boolean.FALSE, exception);
395 }
396
397 return pack(Boolean.TRUE, messages);
398 }
399
400
401 /***
402 * Create a new Queue.
403 *
404 * @param session The session the request is for.
405 * @param queue The queue to create
406 * @return Vector The result of the request.
407 *
408 */
409 protected Vector createQueue(JmsServerSession session, JmsQueue queue) {
410 try {
411 session.createQueue(queue);
412 } catch (JMSException exception) {
413 return pack(Boolean.FALSE, exception);
414 }
415
416 return pack(Boolean.TRUE, null);
417 }
418
419 /***
420 * Create a new topic
421 *
422 * @param session The session the request is for.
423 * @param topic The topic to create
424 * @return Vector The result of the request.
425 *
426 */
427 protected Vector createTopic(JmsServerSession session, JmsTopic topic) {
428 try {
429 session.createTopic(topic);
430 } catch (JMSException exception) {
431 return pack(Boolean.FALSE, exception);
432 }
433
434 return pack(Boolean.TRUE, null);
435 }
436
437 /***
438 * Create a new receiver
439 *
440 * @param session The session the request is for.
441 * @param queue The queue to create the reciver for
442 * @param consumerName The unique name of this consumer,
443 * only valid for persitent messages
444 * @param selector The selector to filter messages. This may be null.
445 * @param connection The MultiplexConnection to the machine the consumer is on
446 * @param host The host the client is running on. Only used for http.
447 * @param port The port the client is listening on. Only used for http
448 * @param url The url for the clients web server. Only used for http
449 * @return Vector The result of the request.
450 *
451 */
452 protected Vector createReceiver(
453 JmsServerSession session, JmsQueue queue,
454 Long consumerId, String selector, MultiplexConnectionIfc connection,
455 String host, String port, String url) {
456
457 try {
458 session.createReceiver(queue, consumerId.longValue(), selector);
459 _server.addConnection(session, connection);
460 } catch (Exception exception) {
461 return pack(Boolean.FALSE, exception);
462 }
463
464 return pack(Boolean.TRUE, null);
465 }
466
467
468 /***
469 * Create a new sender for the given queue.
470 *
471 * @param session The session the request is for.
472 * @param queue The queue the sender is sending to
473 * @return Vector The result of the request.
474 *
475 */
476 protected Vector createSender(JmsServerSession session, JmsQueue queue) {
477 try {
478 session.createSender(queue);
479 } catch (JMSException exception) {
480 return pack(Boolean.FALSE, exception);
481 }
482 return pack(Boolean.TRUE, null);
483 }
484
485
486 /***
487 * Create a new queue browser for the specified session and queue.
488 *
489 * @param session session that the request is for
490 * @param queue queue to browse
491 * @param clientId the client identity
492 * @param selector message selector. May be null
493 * @param connection the connection to the remote machine
494 * @param host The host the client is running on. Only used for http.
495 * @param port The port the client is listening on. Only used for http
496 * @param url The url for the clients web server. Only used for http
497 * @return Vector result of the request
498 *
499 */
500 protected Vector createBrowser(JmsServerSession session,
501 JmsQueue queue, Long clientId,
502 String selector,
503 MultiplexConnectionIfc connection,
504 String host, String port,
505 String url) {
506
507 try {
508 session.createBrowser(queue, clientId.longValue(), selector);
509 _server.addConnection(session, connection);
510 } catch (Exception exception) {
511 return pack(Boolean.FALSE, exception);
512 }
513 return pack(Boolean.TRUE, null);
514 }
515
516 /***
517 * Delete the receiver for this queue.
518 *
519 * @param session - the session the request is for.
520 * @param clientId - the client id
521 * @return Vector The result of the request.
522 *
523 */
524 protected Vector deleteReceiver(JmsServerSession session, Long clientId) {
525 try {
526 session.deleteReceiver(clientId.longValue());
527 } catch (JMSException exception) {
528 return pack(Boolean.FALSE, exception);
529 }
530
531 return pack(Boolean.TRUE, null);
532 }
533
534 /***
535 * Delete the sender for this queue.
536 *
537 * @param session The session the request is for.
538 * @param clientId The identity of the client
539 * @return Vector The result of the request.
540 */
541 protected Vector deleteSender(JmsServerSession session, Long clientId) {
542 try {
543 session.deleteSender(clientId.longValue());
544 } catch (JMSException exception) {
545 return pack(Boolean.FALSE, exception);
546 }
547
548 return pack(Boolean.TRUE, null);
549 }
550
551 /***
552 * Delete the queue browser for the specified queue.
553 *
554 * @param session session that the request is for
555 * @param clientId the identity of the browser
556 * @return Vector The result of the request.
557 */
558 protected Vector deleteBrowser(JmsServerSession session, Long clientId) {
559 try {
560 session.deleteBrowser(clientId.longValue());
561 } catch (JMSException exception) {
562 return pack(Boolean.FALSE, exception);
563 }
564
565 return pack(Boolean.TRUE, null);
566 }
567
568 /***
569 * Create a new subscriber, and connect back to the client through the
570 * MultiplexConnection.
571 *
572 * @param session The session the request is for.
573 * @param topic The topic the subscriber is subscribing on
574 * @param name The unique name of this subscriber,
575 * only valid for persitent messages
576 * @param selector The selector to filter messages. This may be null.
577 * @param connection The MultiplexConnection to the machine the consumer is on
578 * @param host The host the client is running on. Only used for http.
579 * @param port The port the client is listening on. Only used for http
580 * @param url The url for the clients web server. Only used for http
581 * @return Vector The result of the request.
582 */
583 protected Vector createSubscriber(
584 JmsServerSession session, JmsTopic topic, String name, Long clientId,
585 String selector, Boolean noLocal, MultiplexConnectionIfc connection,
586 String host, String port, String url) {
587 try {
588 session.createSubscriber(topic, name, clientId.longValue(),
589 selector, noLocal.booleanValue());
590 _server.addConnection(session, connection);
591 } catch (Exception exception) {
592 return pack(Boolean.FALSE, exception);
593 }
594
595 return pack(Boolean.TRUE, null);
596 }
597
598
599 /***
600 * Create a new publisher for the given topic.
601 *
602 * @param session The session the request is for.
603 * @param topic The topic the publisher is publishing to
604 * @return Vector The result of the request.
605 */
606 protected Vector createPublisher(JmsServerSession session,
607 JmsTopic topic) {
608 try {
609 session.createPublisher(topic);
610 } catch (JMSException exception) {
611 return pack(Boolean.FALSE, exception);
612 }
613
614 return pack(Boolean.TRUE, null);
615 }
616
617 /***
618 * Delete a subscriber for the given topic
619 *
620 * @param session The session the request is for.
621 * @param clientId - The client identity of the subscriber to delete
622 * @return Vector The result of the request.
623 */
624 protected Vector deleteSubscriber(JmsServerSession session,
625 Long clientId) {
626 try {
627 session.deleteSubscriber(clientId.longValue());
628 } catch (JMSException exception) {
629 return pack(Boolean.FALSE, exception);
630 }
631
632 return pack(Boolean.TRUE, null);
633 }
634
635 /***
636 * Delete a publisher for the given topic.
637 *
638 * @param session The session the request is for.
639 * @param topic The topic the publisher is publishing to
640 * @return Vector The result of the request.
641 *
642 */
643 protected Vector deletePublisher(JmsServerSession session,
644 JmsTopic topic) {
645 try {
646 session.deletePublisher(topic);
647 } catch (JMSException exception) {
648 return pack(Boolean.FALSE, exception);
649 }
650
651 return pack(Boolean.TRUE, null);
652 }
653
654 /***
655 * Unsubscribe a durable subscription
656 *
657 * @param session the session the request is for
658 * @param name the name used to identify the
659 * subscription
660 * @return Vector the result of the request.
661 */
662 public Vector unsubscribe(JmsServerSession session, String name) {
663 try {
664 session.unsubscribe(name);
665 } catch (JMSException exception) {
666 return pack(Boolean.FALSE, exception);
667 }
668 return pack(Boolean.TRUE, null);
669 }
670
671 /***
672 * Stop message delivery for this session.
673 *
674 * @param session The session the request is for.
675 * @return Vector The result of the request.
676 *
677 */
678 protected Vector stopMessageDelivery(JmsServerSession session) {
679 try {
680 session.stopMessageDelivery();
681 } catch (JMSException exception) {
682 return pack(Boolean.FALSE, exception);
683 }
684
685 return pack(Boolean.TRUE, null);
686 }
687
688
689 /***
690 * Enable or disable asynchronous message delivery.
691 *
692 * @param session - the session the request is for.
693 * @param clientId - consumer identity
694 * @param enable - true to enable
695 * @return Vector - the result of the request.
696 *
697 */
698 protected Vector enableAsynchronousDelivery(JmsServerSession session,
699 Long clientId, String id,
700 Boolean enable) {
701 try {
702 session.enableAsynchronousDelivery(
703 clientId.longValue(), id, enable.booleanValue());
704 } catch (JMSException exception) {
705 return pack(Boolean.FALSE, exception);
706 }
707
708 return pack(Boolean.TRUE, null);
709 }
710
711 /***
712 * Start message delivery for this session.
713 *
714 * @param session The session the request is for.
715 * @return Vector The result of the request.
716 *
717 */
718 protected Vector startMessageDelivery(JmsServerSession session) {
719 try {
720 session.startMessageDelivery();
721 } catch (JMSException exception) {
722 return pack(Boolean.FALSE, exception);
723 }
724
725 return pack(Boolean.TRUE, null);
726 }
727
728 /***
729 * recover the session
730 *
731 * @param session The session the request is for.
732 * @return Vector The result of the request.
733 */
734 protected Vector recover(JmsServerSession session) {
735 try {
736 session.recover();
737 } catch (JMSException exception) {
738 return pack(Boolean.FALSE, exception);
739 }
740
741 return pack(Boolean.TRUE, null);
742 }
743
744 /***
745 * commit the session
746 *
747 * @param session The session the request is for.
748 * @return Vector The result of the request.
749 */
750 protected Vector commit(JmsServerSession session) {
751 try {
752 session.commit();
753 } catch (JMSException exception) {
754 return pack(Boolean.FALSE, exception);
755 }
756
757 return pack(Boolean.TRUE, null);
758 }
759
760 /***
761 * rollback the session
762 *
763 * @param session The session the request is for.
764 * @return Vector The result of the request.
765 */
766 protected Vector rollback(JmsServerSession session) {
767 try {
768 session.rollback();
769 } catch (JMSException exception) {
770 return pack(Boolean.FALSE, exception);
771 }
772
773 return pack(Boolean.TRUE, null);
774 }
775
776 /***
777 * Commits an XA transaction that is in progress.
778 *
779 * @param xid - the xa transaction identity
780 * @param onePhase - treu if it is a one phase commit
781 * @return Vector
782 */
783 protected Vector XACommit(JmsServerSession session, Xid xid,
784 Boolean onePhase) {
785 try {
786 session.commit(xid, onePhase.booleanValue());
787 } catch (Exception exception) {
788 return pack(Boolean.FALSE, exception);
789 }
790
791 return pack(Boolean.TRUE, null);
792 }
793
794 /***
795 * Ends the work performed on behalf of a transaction branch. The resource
796 * manager disassociates the XA resource from the transaction branch
797 * specified and let the transaction be completedCommits an XA transaction
798 * that is in progress.
799 *
800 * @param xid - the xa transaction identity
801 * @param flags - one of TMSUCCESS, TMFAIL, or TMSUSPEND
802 * @return Vector
803 */
804 protected Vector XAEnd(JmsServerSession session, Xid xid, Integer flags) {
805 try {
806 session.end(xid, flags.intValue());
807 } catch (Exception exception) {
808 return pack(Boolean.FALSE, exception);
809 }
810
811 return pack(Boolean.TRUE, null);
812 }
813
814 /***
815 * Tell the resource manager to forget about a heuristically completed
816 * transaction branch.
817 *
818 * @param xid - the xa transaction identity
819 * @return Vector
820 */
821 protected Vector XAForget(JmsServerSession session, Xid xid) {
822 try {
823 session.forget(xid);
824 } catch (Exception exception) {
825 return pack(Boolean.FALSE, exception);
826 }
827
828 return pack(Boolean.TRUE, null);
829 }
830
831 /***
832 * Return the transaction timeout for this instance of the resource
833 * manager.
834 *
835 * @return int - the timeout in seconds
836 * @return Vector
837 */
838 protected Vector XAGetTransactionTimeout(JmsServerSession session) {
839 int seconds = 0;
840 try {
841 seconds = session.getTransactionTimeout();
842 } catch (Exception exception) {
843 return pack(Boolean.FALSE, exception);
844 }
845
846 return pack(Boolean.TRUE, new Integer(seconds));
847 }
848
849 /***
850 * Ask the resource manager to prepare for a transaction commit of the
851 * transaction specified in xid
852 *
853 * @param xid - the xa transaction identity
854 * @return Vector
855 */
856 protected Vector XAPrepare(JmsServerSession session, Xid xid) {
857 try {
858 session.prepare(xid);
859 } catch (Exception exception) {
860 return pack(Boolean.FALSE, exception);
861 }
862
863 return pack(Boolean.TRUE, null);
864 }
865
866 /***
867 * Obtain a list of prepared transaction branches from a resource manager.
868 * The transaction manager calls this method during recovery to obtain the
869 * list of transaction branches that are currently in prepared or
870 * heuristically completed states.
871 *
872 * @param flag - One of TMSTARTRSCAN, TMENDRSCAN, TMNOFLAGS. TMNOFLAGS
873 * @param Xid[] - the set of Xids to recover
874 * @return Vector
875 */
876 public Vector XARecover(JmsServerSession session, Integer flag) {
877 Xid[] xids = null;
878 try {
879 xids = session.recover(flag.intValue());
880 } catch (Exception exception) {
881 return pack(Boolean.FALSE, exception);
882 }
883
884 return pack(Boolean.TRUE, xids);
885 }
886
887 /***
888 * Inform the resource manager to roll back work done on behalf of a
889 * transaction branch
890 *
891 * @param xid - the xa transaction identity
892 * @author Vector
893 */
894 protected Vector XARollback(JmsServerSession session, Xid xid) {
895 try {
896 session.rollback(xid);
897 } catch (Exception exception) {
898 return pack(Boolean.FALSE, exception);
899 }
900
901 return pack(Boolean.TRUE, null);
902 }
903
904 /***
905 * Set the current transaction timeout value for this XAResource instance.
906 *
907 * @param seconds - timeout in seconds
908 * @return boolean - true if the new transaction timeout was accepted
909 * @return Vector
910 */
911 protected Vector XASetTransactionTimeout(JmsServerSession session,
912 Integer seconds) {
913 boolean result = false;
914 try {
915 result = session.setTransactionTimeout(seconds.intValue());
916 } catch (Exception exception) {
917 return pack(Boolean.FALSE, exception);
918 }
919
920 return pack(Boolean.TRUE, new Boolean(result));
921 }
922
923 /***
924 * Start work on behalf of a transaction branch specified in xid If TMJOIN
925 * is specified, the start is for joining a transaction previously seen by
926 * the resource manager
927 *
928 * @param xid - the xa transaction identity
929 * @param flags - One of TMNOFLAGS, TMJOIN, or TMRESUME
930 * @return Vector
931 */
932 protected Vector XAStart(JmsServerSession session, Xid xid,
933 Integer flags) {
934 try {
935 session.start(xid, flags.intValue());
936 } catch (Exception exception) {
937 return pack(Boolean.FALSE, exception);
938 }
939
940 return pack(Boolean.TRUE, null);
941 }
942
943 /***
944 * Return the identity of the resource manager.
945 *
946 * @param session - the session identity
947 * @return Vector
948 */
949 protected Vector XAGetResourceManagerId(JmsServerSession session) {
950 String id = null;
951 try {
952 id = session.getResourceManagerId();
953 } catch (Exception exception) {
954 return pack(Boolean.FALSE, exception);
955 }
956
957 return pack(Boolean.TRUE, id);
958 }
959
960 /***
961 * Pack all the data that is required by the server in a vector.
962 * Set the size of the vector to be exactly the right size for efficiency.
963 *
964 * @param success Boolean indicating success or failure of request.
965 * @param ob The Object being returned.
966 * @return Vector The vector containing all the data.
967 *
968 */
969 protected Vector pack(Boolean success, Object ob) {
970 Vector v = new Vector(2);
971 v.add(success);
972 v.add(ob);
973 return v;
974 }
975
976 }
977
This page was automatically generated by Maven