001: /*
002:
003: Derby - Class org.apache.derby.client.ClientXid
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to You under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021: package org.apache.derby.client;
022:
023: import javax.transaction.xa.Xid;
024:
025: public class ClientXid implements Xid {
026: //
027: // The format identifier for the Xid. A value of -1 indicates
028: // that the NULLXid
029: //
030: private int formatID_;
031:
032: //
033: // The number of bytes in the global transaction identfier
034: //
035: private int gtrid_length_;
036:
037: //
038: // The number of bytes in the branch qualifier
039: //
040: private int bqual_length_;
041:
042: //
043: // The data for the Xid.
044: // <p> The Xid is made up of two contiguous parts. The first (of size
045: // <b>gtrid_length</b>) is the global transaction identfier and the second
046: // (of size <b>bqual_length</b>) is the branch qualifier.
047: // <p>If the <b>formatID</b> is -1, indicating the NULLXid, the data is
048: // ignored.
049: //
050: private byte data_[];
051:
052: //
053: // The size of <b>data</b>.
054: //
055: static private final int XidDATASIZE = 128;
056:
057: //
058: // The maximum size of the global transaction identifier.
059: //
060: static public final int MAXGTRIDSIZE = 64;
061:
062: //
063: // The maximum size of the branch qualifier.
064: //
065: static public final int MAXBQUALSIZE = 64;
066:
067: static private final String hextab_ = "0123456789ABCDEF";
068:
069: //
070: // Constructs a new null Xid.
071: // <p>After construction the data within the Xid should be initialized.
072: //
073: public ClientXid() {
074: data_ = new byte[XidDATASIZE];
075: gtrid_length_ = 0;
076: bqual_length_ = 0;
077: formatID_ = -1;
078: }
079:
080: //
081: // another contructor
082: //
083: public ClientXid(int formatID, byte[] gtrid, byte[] bqual) {
084:
085: formatID_ = formatID;
086: gtrid_length_ = gtrid.length;
087: bqual_length_ = bqual.length;
088: data_ = new byte[XidDATASIZE];
089: System.arraycopy(gtrid, 0, data_, 0, gtrid_length_);
090: System.arraycopy(bqual, 0, data_, gtrid_length_, bqual_length_);
091: }
092:
093: //
094: // Return a string representing this Xid for debuging
095: //
096: // @return the string representation of this Xid
097: //
098: public String toString() {
099: StringBuffer d; // Data String, in HeXidecimal
100: String s; // Resultant String
101: int i;
102: int v;
103: int L;
104:
105: L = gtrid_length_ + bqual_length_;
106: d = new StringBuffer(L + L);
107:
108: for (i = 0; i < L; i++) {
109: // Convert data string to hex
110: v = data_[i] & 0xff;
111: d.append(hextab_.charAt(v / 16));
112: d.append(hextab_.charAt(v & 15));
113: if ((i + 1) % 4 == 0 && (i + 1) < L) {
114: d.append(" ");
115: }
116: }
117:
118: s = "{ClientXid: " + "formatID(" + formatID_ + "), "
119: + "gtrid_length(" + gtrid_length_ + "), "
120: + "bqual_length(" + bqual_length_ + "), " + "data("
121: + d.toString() + ")" + "}";
122: return s;
123: }
124:
125: //
126: // Returns the branch qualifier for this Xid.
127: //
128: // @return the branch qualifier
129: //
130: public byte[] getBranchQualifier() {
131: byte[] bqual = new byte[bqual_length_];
132: System.arraycopy(data_, gtrid_length_, bqual, 0, bqual_length_);
133: return bqual;
134: }
135:
136: //
137: // Set the branch qualifier for this Xid.
138: //
139: // @param qual a Byte array containing the branch qualifier to be set. If
140: // the size of the array exceeds MAXBQUALSIZE, only the first MAXBQUALSIZE
141: // elements of qual will be used.
142: //
143: public void setBranchQualifier(byte[] qual) {
144: bqual_length_ = qual.length > MAXBQUALSIZE ? MAXBQUALSIZE
145: : qual.length;
146: System.arraycopy(qual, 0, data_, gtrid_length_, bqual_length_);
147: }
148:
149: //
150: // Obtain the format identifier part of the Xid.
151: //
152: // @return Format identifier. -1 indicates a null Xid
153: //
154: public int getFormatId() {
155: return formatID_;
156: }
157:
158: //
159: // Set the format identifier part of the Xid.
160: //
161: // @param Format identifier. -1 indicates a null Xid.
162: //
163: public void setFormatID(int formatID) {
164: formatID_ = formatID;
165: return;
166: }
167:
168: //
169: // Returns the global transaction identifier for this Xid.
170: //
171: // @return the global transaction identifier
172: //
173: public byte[] getGlobalTransactionId() {
174: byte[] gtrid = new byte[gtrid_length_];
175: System.arraycopy(data_, 0, gtrid, 0, gtrid_length_);
176: return gtrid;
177: }
178:
179: //
180: // return fields of Xid
181: //
182: public byte[] getData() {
183: return data_;
184: }
185:
186: public int getGtridLength() {
187: return gtrid_length_;
188: }
189:
190: public int getBqualLength() {
191: return bqual_length_;
192: }
193:
194: public int hashCode() {
195: if (formatID_ == (-1)) {
196: return (-1);
197: }
198: return formatID_ + gtrid_length_ - bqual_length_;
199: }
200:
201: public boolean equals(Object obj) {
202: return org.apache.derby.client.net.NetXAResource.xidsEqual(
203: this , (javax.transaction.xa.Xid) obj);
204: }
205: } // class Xid
|