1 /***
2 *
3 * Copyright 2004 Protique Ltd
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 **/
18 package org.codehaus.activemq;
19
20 import org.apache.commons.logging.Log;
21 import org.apache.commons.logging.LogFactory;
22 import org.codehaus.activemq.message.ResponseReceipt;
23 import org.codehaus.activemq.message.TransactionInfo;
24 import org.codehaus.activemq.message.XATransactionInfo;
25 import org.codehaus.activemq.transport.TransportChannel;
26
27 import javax.jms.*;
28
29 /***
30 * The XAConnection interface extends the capability of Connection by providing
31 * an XASession (optional).
32 * <p/>
33 * The XAConnection interface is optional. JMS providers are not required to
34 * support this interface. This interface is for use by JMS providers to
35 * support transactional environments. Client programs are strongly encouraged
36 * to use the transactional support available in their environment, rather
37 * than use these XA interfaces directly.
38 *
39 * @version $Revision: 1.6 $
40 * @see javax.jms.Connection
41 * @see javax.jms.ConnectionFactory
42 * @see javax.jms.QueueConnection
43 * @see javax.jms.TopicConnection
44 * @see javax.jms.TopicConnectionFactory
45 * @see javax.jms.QueueConnection
46 * @see javax.jms.QueueConnectionFactory
47 */
48 public class ActiveMQXAConnection extends ActiveMQConnection implements XATopicConnection, XAQueueConnection, XAConnection {
49
50 private static final Log log = LogFactory.getLog(ActiveMQXAConnection.class);
51 private final String resourceManagerId;
52
53 public ActiveMQXAConnection(ActiveMQConnectionFactory factory, String theUserName, String thePassword, TransportChannel transportChannel) throws JMSException {
54 super(factory, theUserName, thePassword, transportChannel);
55 resourceManagerId = determineResourceManagerId();
56 }
57
58 public ActiveMQXAConnection(ActiveMQConnectionFactory factory, String theUserName, String thePassword) throws JMSException {
59 super(factory, theUserName, thePassword);
60 resourceManagerId = determineResourceManagerId();
61 }
62
63 /***
64 * Get's the resource manager id.
65 */
66 private String determineResourceManagerId() throws JMSException {
67
68 XATransactionInfo info = new XATransactionInfo();
69 info.setId(this.packetIdGenerator.generateId());
70 info.setType(TransactionInfo.GET_RM_ID);
71
72 ResponseReceipt receipt = (ResponseReceipt) syncSendRequest(info);
73 String rmId = (String) receipt.getResult();
74 assert rmId != null;
75 return rmId;
76 }
77
78 public XASession createXASession() throws JMSException {
79 return createActiveMQXASession();
80 }
81
82 public QueueSession createQueueSession(boolean transacted, int acknowledgeMode) throws JMSException {
83 return createActiveMQXASession();
84 }
85
86 public TopicSession createTopicSession(boolean transacted, int acknowledgeMode) throws JMSException {
87 return createActiveMQXASession();
88 }
89
90 public Session createSession(boolean transacted, int acknowledgeMode) throws JMSException {
91 return createActiveMQXASession();
92 }
93
94 public XATopicSession createXATopicSession() throws JMSException {
95 return createActiveMQXASession();
96 }
97
98 public XAQueueSession createXAQueueSession() throws JMSException {
99 return createActiveMQXASession();
100 }
101
102 protected ActiveMQXASession createActiveMQXASession() throws JMSException {
103 checkClosed();
104 return new ActiveMQXASession(this);
105 }
106
107 /***
108 * @return Returns the resourceManagerId.
109 */
110 public String getResourceManagerId() {
111 return resourceManagerId;
112 }
113 }