001: /*
002: * $Id: GenericXaResource.java,v 1.2 2003/12/04 21:54:20 ajzeneski Exp $
003: *
004: * Copyright (c) 2003 The Open For Business Project - www.ofbiz.org
005: *
006: * Permission is hereby granted, free of charge, to any person obtaining a
007: * copy of this software and associated documentation files (the "Software"),
008: * to deal in the Software without restriction, including without limitation
009: * the rights to use, copy, modify, merge, publish, distribute, sublicense,
010: * and/or sell copies of the Software, and to permit persons to whom the
011: * Software is furnished to do so, subject to the following conditions:
012: *
013: * The above copyright notice and this permission notice shall be included
014: * in all copies or substantial portions of the Software.
015: *
016: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
017: * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
018: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
019: * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
020: * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
021: * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
022: * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
023: *
024: */
025: package org.ofbiz.entity.transaction;
026:
027: import org.ofbiz.base.util.Debug;
028:
029: import javax.transaction.xa.XAResource;
030: import javax.transaction.xa.Xid;
031: import javax.transaction.xa.XAException;
032: import javax.transaction.*;
033:
034: /**
035: * GenericXaResource - Abstract XA Resource implementation supporting a single transaction
036: *
037: * @author <a href="mailto:jaz@ofbiz.org">Andy Zeneski</a>
038: * @version $Revision: 1.2 $
039: * @since 3.0
040: */
041: public abstract class GenericXaResource implements XAResource {
042:
043: public static final String module = GenericXaResource.class
044: .getName();
045:
046: protected boolean active = false;
047: protected int timeout = 0;
048: protected Xid xid = null;
049:
050: /**
051: * Enlists this resource in the current transaction
052: * @throws XAException
053: */
054: public void enlist() throws XAException {
055: TransactionManager tm = TransactionFactory
056: .getTransactionManager();
057: try {
058: if (tm != null && tm.getStatus() == Status.STATUS_ACTIVE) {
059: Transaction tx = tm.getTransaction();
060: if (tx != null) {
061: tx.enlistResource(this );
062: } else {
063: throw new XAException(XAException.XAER_NOTA);
064: }
065: } else {
066: throw new XAException(
067: "No transaction manager or invalid status");
068: }
069: } catch (SystemException e) {
070: throw new XAException("Unable to get transaction status");
071: } catch (RollbackException e) {
072: throw new XAException(
073: "Unable to enlist resource with transaction");
074: }
075: }
076:
077: /**
078: * @see javax.transaction.xa.XAResource#start(javax.transaction.xa.Xid xid, int flag)
079: */
080: public void start(Xid xid, int flag) throws XAException {
081: if (this .active) {
082: if (this .xid != null && this .xid.equals(xid)) {
083: throw new XAException(XAException.XAER_DUPID);
084: } else {
085: throw new XAException(XAException.XAER_PROTO);
086: }
087: }
088: if (this .xid != null && !this .xid.equals(xid)) {
089: throw new XAException(XAException.XAER_NOTA);
090: }
091:
092: this .xid = xid;
093: this .active = true;
094: }
095:
096: /**
097: * @see javax.transaction.xa.XAResource#end(javax.transaction.xa.Xid xid, int flag)
098: */
099: public void end(Xid xid, int flag) throws XAException {
100: if (!this .active) {
101: throw new XAException(XAException.XAER_PROTO);
102: }
103:
104: if (this .xid == null || !this .xid.equals(xid)) {
105: throw new XAException(XAException.XAER_NOTA);
106: }
107: this .active = false;
108: }
109:
110: /**
111: * @see javax.transaction.xa.XAResource#forget(javax.transaction.xa.Xid xid)
112: */
113: public void forget(Xid xid) throws XAException {
114: if (this .xid == null || !this .xid.equals(xid)) {
115: throw new XAException(XAException.XAER_NOTA);
116: }
117: this .xid = null;
118: if (active) {
119: // non-fatal
120: Debug.logWarning("forget() called without end()", module);
121: }
122: }
123:
124: /**
125: * @see javax.transaction.xa.XAResource#prepare(javax.transaction.xa.Xid xid)
126: */
127: public int prepare(Xid xid) throws XAException {
128: if (this .xid == null || !this .xid.equals(xid)) {
129: throw new XAException(XAException.XAER_NOTA);
130: }
131: return XA_OK;
132: }
133:
134: /**
135: * @see javax.transaction.xa.XAResource#recover(int flag)
136: */
137: public Xid[] recover(int flag) throws XAException {
138: if (this .xid == null) {
139: return new Xid[0];
140: } else {
141: return new Xid[] { this .xid };
142: }
143: }
144:
145: /**
146: * @see javax.transaction.xa.XAResource#isSameRM(javax.transaction.xa.XAResource xaResource)
147: */
148: public boolean isSameRM(XAResource xaResource) throws XAException {
149: return xaResource == this ;
150: }
151:
152: /**
153: * @see javax.transaction.xa.XAResource#getTransactionTimeout()
154: */
155: public int getTransactionTimeout() throws XAException {
156: return this .timeout;
157: }
158:
159: /**
160: * @see javax.transaction.xa.XAResource#setTransactionTimeout(int seconds)
161: * Note: the valus is saved but in the current implementation this is not used.
162: */
163: public boolean setTransactionTimeout(int seconds)
164: throws XAException {
165: this .timeout = seconds;
166: return true;
167: }
168:
169: /**
170: * @see javax.transaction.xa.XAResource#commit(javax.transaction.xa.Xid xid, boolean onePhase)
171: */
172: public abstract void commit(Xid xid, boolean onePhase)
173: throws XAException;
174:
175: /**
176: * @see javax.transaction.xa.XAResource#rollback(javax.transaction.xa.Xid xid)
177: */
178: public abstract void rollback(Xid xid) throws XAException;
179: }
|