package org.jboss.tm;
import java.io.IOException;
import javax.transaction.xa.Xid;
public class GlobalId
implements java.io.Externalizable
{
static final long serialVersionUID = 6879509375433435464L;
private int formatId;
private byte[] globalId;
private int hash;
public GlobalId()
{
}
GlobalId(int formatId, byte[] globalId, int hash)
{
this.formatId = formatId;
this.globalId = globalId;
this.hash = hash;
}
public GlobalId(int formatId, byte[] globalId)
{
this.formatId = formatId;
this.globalId = globalId;
hash = computeHash();
}
public GlobalId(Xid xid)
{
formatId = xid.getFormatId();
globalId = xid.getGlobalTransactionId();
if (xid instanceof XidImpl && formatId == XidImpl.JBOSS_FORMAT_ID)
{
hash = xid.hashCode();
}
else
{
hash = computeHash();
}
}
public GlobalId(int formatId, int bqual_length, byte[] tid)
{
this.formatId = formatId;
if (bqual_length == 0)
globalId = tid;
else
{
int len = tid.length - bqual_length;
globalId = new byte[len];
System.arraycopy(tid, 0, globalId, 0, len);
}
hash = computeHash();
}
public boolean equals(Object obj)
{
if (obj instanceof GlobalId) {
GlobalId other = (GlobalId)obj;
if (formatId != other.formatId)
return false;
if (globalId == other.globalId)
return true;
if (globalId.length != other.globalId.length)
return false;
int len = globalId.length;
for (int i = 0; i < len; ++i)
if (globalId[i] != other.globalId[i])
return false;
return true;
}
return false;
}
public int hashCode()
{
return hash;
}
public String toString()
{
return getClass().getName() + "[formatId=" + formatId
+ ", globalId=" + new String(globalId).trim()
+ ", hash=" + hash + "]";
}
public void writeExternal(java.io.ObjectOutput out)
throws IOException
{
out.writeInt(formatId);
out.writeObject(globalId);
}
public void readExternal(java.io.ObjectInput in)
throws IOException, ClassNotFoundException
{
formatId = in.readInt();
globalId = (byte[])in.readObject();
hash = computeHash();
}
private int computeHash()
{
if (formatId == XidImpl.JBOSS_FORMAT_ID)
{
return (int)TransactionImpl.xidFactory.extractLocalIdFrom(globalId);
}
else
{
int len = globalId.length;
int hashval = 0;
for (int i = 0; i < len; ++i)
hashval = 3 * globalId[i] + hashval;
hashval += formatId;
return hashval;
}
}
}