001 /** 002 * 003 * Copyright 2004 Hiram Chirino 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 * 017 **/ 018 package org.activemq.ra; 019 020 import javax.jms.JMSException; 021 import javax.resource.ResourceException; 022 import javax.resource.spi.LocalTransaction; 023 import javax.transaction.xa.XAException; 024 import javax.transaction.xa.XAResource; 025 import javax.transaction.xa.Xid; 026 027 import org.activemq.TransactionContext; 028 029 /** 030 * Used to provide a LocalTransaction and XAResource to a JMS session. 031 */ 032 public class LocalAndXATransaction implements XAResource, LocalTransaction { 033 034 final private TransactionContext transactionContext; 035 private boolean inManagedTx; 036 037 public LocalAndXATransaction(TransactionContext transactionContext) { 038 this.transactionContext=transactionContext; 039 } 040 041 public void setInManagedTx(boolean inManagedTx) throws JMSException { 042 this.inManagedTx=inManagedTx; 043 } 044 045 public void begin() throws ResourceException { 046 try { 047 transactionContext.begin(); 048 setInManagedTx(true); 049 } catch (JMSException e) { 050 throw new ResourceException("begin failed.", e); 051 } 052 } 053 054 public void commit() throws ResourceException { 055 try { 056 transactionContext.commit(); 057 } catch (JMSException e) { 058 throw new ResourceException("commit failed.", e); 059 } finally { 060 try { 061 setInManagedTx(false); 062 } catch (JMSException e) { 063 throw new ResourceException("commit failed.",e); 064 } 065 } 066 } 067 068 public void rollback() throws ResourceException { 069 try { 070 transactionContext.rollback(); 071 } catch (JMSException e) { 072 throw new ResourceException("rollback failed.", e); 073 } finally { 074 try { 075 setInManagedTx(false); 076 } catch (JMSException e) { 077 throw new ResourceException("rollback failed.",e); 078 } 079 } 080 } 081 082 public void commit(Xid arg0, boolean arg1) throws XAException { 083 transactionContext.commit(arg0, arg1); 084 } 085 086 public void end(Xid arg0, int arg1) throws XAException { 087 try { 088 transactionContext.end(arg0, arg1); 089 } finally { 090 try { 091 setInManagedTx(false); 092 } catch (JMSException e) { 093 throw (XAException)new XAException(XAException.XAER_PROTO).initCause(e); 094 } 095 } 096 } 097 098 public void forget(Xid arg0) throws XAException { 099 transactionContext.forget(arg0); 100 } 101 102 public int getTransactionTimeout() throws XAException { 103 return transactionContext.getTransactionTimeout(); 104 } 105 106 public boolean isSameRM(XAResource xaresource) throws XAException { 107 if (xaresource == null) 108 return false; 109 // Do we have to unwrap? 110 if (xaresource instanceof LocalAndXATransaction) { 111 xaresource = ((LocalAndXATransaction)xaresource).transactionContext; 112 } 113 return transactionContext.isSameRM(xaresource); 114 } 115 116 public int prepare(Xid arg0) throws XAException { 117 return transactionContext.prepare(arg0); 118 } 119 120 public Xid[] recover(int arg0) throws XAException { 121 return transactionContext.recover(arg0); 122 } 123 124 public void rollback(Xid arg0) throws XAException { 125 transactionContext.rollback(arg0); 126 } 127 128 public boolean setTransactionTimeout(int arg0) throws XAException { 129 return transactionContext.setTransactionTimeout(arg0); 130 } 131 132 public void start(Xid arg0, int arg1) throws XAException { 133 transactionContext.start(arg0, arg1); 134 try { 135 setInManagedTx(true); 136 } catch (JMSException e) { 137 throw (XAException)new XAException(XAException.XAER_PROTO).initCause(e); 138 } 139 } 140 141 public boolean isInManagedTx() { 142 return inManagedTx; 143 } 144 }