/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.client.xa; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.math.BigInteger; import java.util.Arrays; import javax.transaction.xa.Xid; /** * Teiid implementation of Xid. */ public class XidImpl implements Xid, Externalizable { private static final long serialVersionUID = -7078441828703404308L; private int formatID; private byte[] globalTransactionId; private byte[] branchQualifier; private String toString; public XidImpl() { } public XidImpl(Xid xid) { this.formatID = xid.getFormatId(); this.globalTransactionId = xid.getGlobalTransactionId(); this.branchQualifier = xid.getBranchQualifier(); } public XidImpl(int formatID, byte[] globalTransactionId, byte[] branchQualifier){ this.formatID = formatID; this.globalTransactionId = globalTransactionId; this.branchQualifier = branchQualifier; } /** * @see javax.transaction.xa.Xid#getFormatId() */ public int getFormatId() { return formatID; } /** * @see javax.transaction.xa.Xid#getGlobalTransactionId() */ public byte[] getGlobalTransactionId() { return globalTransactionId; } /** * @see javax.transaction.xa.Xid#getBranchQualifier() */ public byte[] getBranchQualifier() { return branchQualifier; } public boolean equals(Object obj){ if(obj == this) { return true; } if(!(obj instanceof XidImpl)){ return false; } XidImpl that = (XidImpl)obj; return this.formatID == that.formatID && Arrays.equals(this.globalTransactionId, that.globalTransactionId) && Arrays.equals(this.branchQualifier, that.branchQualifier); } /** * @see java.lang.Object#toString() */ public String toString() { if (toString == null) { StringBuffer sb = new StringBuffer(); sb.append("Teiid-Xid global:"); //$NON-NLS-1$ sb.append(getByteArrayString(globalTransactionId)); sb.append(" branch:"); //$NON-NLS-1$ sb.append(getByteArrayString(branchQualifier)); sb.append(" format:"); //$NON-NLS-1$ sb.append(getFormatId()); toString = sb.toString(); } return toString; } static String getByteArrayString(byte[] bytes) { if (bytes == null || bytes.length == 0) { return null; } return new BigInteger(bytes).toString(); } /** * @see java.lang.Object#hashCode() */ public int hashCode() { return toString().hashCode(); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { this.formatID = in.readInt(); this.globalTransactionId = (byte[])in.readObject(); this.branchQualifier = (byte[])in.readObject(); } @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeInt(this.formatID); out.writeObject(this.globalTransactionId); out.writeObject(this.branchQualifier); } }