001: /*
002: * @(#) JTATransactionServiceContext
003: *
004: * JOTM: Java Open Transaction Manager
005: *
006: * This module was originally developed by
007: * - INRIA inside the ObjectWeb Consortium(http://www.objectweb.org)
008: *
009: * The original code and portions created by INRIA are
010: * Copyright (C) 2002 - INRIA (www.inria.fr)
011: * All rights reserved.
012: *
013: * Redistribution and use in source and binary forms, with or without
014: * modification, are permitted provided that the following conditions are met:
015: *
016: * -Redistributions of source code must retain the above copyright notice, this
017: * list of conditions and the following disclaimer.
018: *
019: * -Redistributions in binary form must reproduce the above copyright notice,
020: * this list of conditions and the following disclaimer in the documentation
021: * and/or other materials provided with the distribution.
022: *
023: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
024: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
025: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
026: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
027: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
028: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
029: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
030: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
031: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
032: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
033: * POSSIBILITY OF SUCH DAMAGE.
034: *
035: * --------------------------------------------------------------------------
036: * $Id: JTATransactionServiceContext.java,v 1.8 2004/10/29 04:16:10 tonyortiz Exp $
037: * --------------------------------------------------------------------------
038: */
039: package org.objectweb.jotm.jta.rmi;
040:
041: // java import
042: import java.io.Externalizable;
043: import java.io.IOException;
044: import java.io.ObjectInput;
045: import java.io.ObjectOutput;
046:
047: // import javax.transaction.xa.Xid;
048: import org.objectweb.jotm.Xid;
049:
050: import org.objectweb.carol.rmi.jrmp.interceptor.JServiceContext;
051: import org.objectweb.jotm.Coordinator;
052: import org.objectweb.jotm.InternalTransactionContext;
053: import org.objectweb.jotm.TransactionContext;
054: import org.objectweb.jotm.XidImpl;
055:
056: /**
057: * Class <code>JTATransactionServiceContext</code> is a JRMP Class for Transaction
058: * Context Propagation
059: *
060: * @author Guillaume Riviere (Guillaume.Riviere@inrialpes.fr)
061: * @version 1.0, 13/09/2002
062: */
063: public class JTATransactionServiceContext implements JServiceContext,
064: Externalizable {
065:
066: /**
067: * Transaction Context
068: */
069: transient TransactionContext txCtx = null;
070:
071: /**
072: * true is this is a reply
073: */
074: transient boolean isReply;
075:
076: /**
077: * context id
078: */
079: private transient int context_id;
080:
081: /**
082: * empty constructor for extarenalizable
083: */
084: public JTATransactionServiceContext() {
085: this .context_id = JTAClientTransactionInterceptor.TX_CTX_ID;
086: }
087:
088: /**
089: * the JServiceContext id
090: */
091: public int getContextId() {
092: return context_id;
093: }
094:
095: /**
096: * constructor
097: * @param txCtx TransactionContext the RMI (Serializable) Transaction Context
098: * @param isReply boolean is reply indicator
099: */
100: public void setContext(TransactionContext txCtx, boolean isReply) {
101: this .txCtx = txCtx;
102: this .isReply = isReply;
103: }
104:
105: /**
106: * get the transaction context
107: * @return TransactionContext the Transaction context
108: */
109: public TransactionContext getTransactionContext() {
110: return txCtx;
111: }
112:
113: /**
114: * readExternal to initialise Transaction context
115: * @param in the object input
116: */
117: public void readExternal(ObjectInput in) throws IOException,
118: ClassNotFoundException {
119: // read Xid
120: int fid = in.readInt();
121: byte[] gti = new byte[in.readInt()];
122: in.read(gti);
123: byte[] bq = new byte[in.readInt()];
124: in.read(bq);
125: Xid xid = new XidImpl(fid, gti, bq);
126: // read Coordinator
127: Coordinator coor = (Coordinator) in.readObject();
128: // read timeout
129: int timeout = in.readInt();
130: this .txCtx = new InternalTransactionContext(timeout, coor,
131: (javax.transaction.xa.Xid) xid);
132: }
133:
134: /**
135: * writeExternal to send Transaction context
136: * @param out the object output
137: */
138: public void writeExternal(ObjectOutput out) throws IOException {
139: // send Xid
140: Xid xid = txCtx.getXid();
141: out.writeInt(xid.getFormatId());
142: out.writeInt(xid.getGlobalTransactionId().length);
143: out.write(xid.getGlobalTransactionId());
144: out.writeInt(xid.getBranchQualifier().length);
145: out.write(xid.getBranchQualifier());
146: // send Coordinator
147: out.writeObject(txCtx.getCoordinator());
148: // send timeout
149: out.writeInt(txCtx.getTimeout());
150: }
151: }
|