001: /*
002: * Copyright 2004-2008 H2 Group. Licensed under the H2 License, Version 1.0
003: * (http://h2database.com/html/license.html).
004: * Initial Developer: H2 Group
005: */
006: package org.h2.jdbcx;
007:
008: import java.sql.SQLException;
009: import java.util.StringTokenizer;
010:
011: //#ifdef JDK14
012: import javax.transaction.xa.Xid; //#endif
013:
014: import org.h2.constant.ErrorCode;
015: import org.h2.message.Message;
016: import org.h2.message.TraceObject;
017: import org.h2.util.ByteUtils;
018:
019: /**
020: * An object of this class represents a transaction id.
021: */
022: public class JdbcXid extends TraceObject
023: //#ifdef JDK14
024: implements Xid
025: //#endif
026: {
027:
028: private static final String PREFIX = "XID";
029:
030: private int formatId;
031: private byte[] branchQualifier;
032: private byte[] globalTransactionId;
033:
034: JdbcXid(JdbcDataSourceFactory factory, int id, String tid)
035: throws SQLException {
036: setTrace(factory.getTrace(), TraceObject.XID, id);
037: try {
038: StringTokenizer tokenizer = new StringTokenizer(tid, "_");
039: String prefix = tokenizer.nextToken();
040: if (!PREFIX.equals(prefix)) {
041: throw Message.getSQLException(
042: ErrorCode.WRONG_XID_FORMAT_1, tid);
043: }
044: formatId = Integer.parseInt(tokenizer.nextToken());
045: branchQualifier = ByteUtils.convertStringToBytes(tokenizer
046: .nextToken());
047: globalTransactionId = ByteUtils
048: .convertStringToBytes(tokenizer.nextToken());
049: } catch (Throwable e) {
050: throw Message.getSQLException(ErrorCode.WRONG_XID_FORMAT_1,
051: tid);
052: }
053: }
054:
055: /**
056: * INTERNAL
057: */
058: public String getAsString() {
059: StringBuffer buff = new StringBuffer(PREFIX);
060: buff.append('_');
061: buff.append(formatId);
062: buff.append('_');
063: buff.append(ByteUtils.convertBytesToString(branchQualifier));
064: buff.append('_');
065: buff
066: .append(ByteUtils
067: .convertBytesToString(globalTransactionId));
068: return buff.toString();
069: }
070:
071: /**
072: * Get the format id.
073: *
074: * @return the format id
075: */
076: public int getFormatId() {
077: debugCodeCall("getFormatId");
078: return formatId;
079: }
080:
081: /**
082: * The transaction branch identifier.
083: *
084: * @return the identifier
085: */
086: public byte[] getBranchQualifier() {
087: debugCodeCall("getBranchQualifier");
088: return branchQualifier;
089: }
090:
091: /**
092: * The global transaction identifier.
093: *
094: * @return the transaction id
095: */
096: public byte[] getGlobalTransactionId() {
097: debugCodeCall("getGlobalTransactionId");
098: return globalTransactionId;
099: }
100:
101: /**
102: * INTERNAL
103: */
104: public String toString() {
105: return getTraceObjectName() + ": " + getAsString();
106: }
107:
108: }
|