openesb-components/ojc-core/databasebc/databasebcimpl/src/org/glassfish/openesb/databasebc/transaction/XidImpl.java

217 lines
5.9 KiB
Java

/*
* BEGIN_HEADER - DO NOT EDIT
*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the "License"). You may not use this file except
* in compliance with the License.
*
* You can obtain a copy of the license at
* https://open-jbi-components.dev.java.net/public/CDDLv1.0.html.
* See the License for the specific language governing
* permissions and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* HEADER in each file and include the License file at
* https://open-jbi-components.dev.java.net/public/CDDLv1.0.html.
* If applicable add the following below this CDDL HEADER,
* with the fields enclosed by brackets "[]" replaced with
* your own identifying information: Portions Copyright
* [year] [name of copyright owner]
*/
/*
* @(#)XidImpl.java
*
* Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved.
*
* END_HEADER - DO NOT EDIT
*/
package org.glassfish.openesb.databasebc.transaction;
/**
*
* @author Venkat P
*/
import javax.transaction.xa.Xid;
/**
* This object encapsulates the ID of a transaction.
* This implementation is immutable and always serializable at runtime.
*
* @author <a href="Narayana.Rallabandi@Sun.Com">Narayana Rallabandi</a>
* @version
*/
public class XidImpl implements Xid, java.io.Serializable {
static final long serialVersionUID = -123456789L;
public static final int FORMAT_ID = 0x0101;
private static boolean trulyGlobalIdsEnabled = false;
// represents the format id for this xid
private final int formatId;
// global id immutable once set
private final byte[] globalId;
// branch qualifier
private final byte[] branchId;
// hash for the xid
private final int hash;
// local id for this xid
private final long localId;
//global id
private final GlobalId trulyGlobalId;
public static void setTrulyGlobalIdsEnabled(boolean newValue) {
trulyGlobalIdsEnabled = newValue;
}
public static boolean getTrulyGlobalIdsEnabled() {
return trulyGlobalIdsEnabled;
}
public static String toString(Xid id){
if (id == null)
return "[NULL Xid]";
String s = id.getClass().getName();
s = s.substring(s.lastIndexOf('.') + 1);
s = s + "[FormatId=" + id.getFormatId()
+ ", GlobalId=" + new String(id.getGlobalTransactionId()).trim()
+ ", BranchQual=" + new String(id.getBranchQualifier()).trim()
+ ((id instanceof XidImpl) ? ", localId=" + ((XidImpl)id).localId
: "")
+ "]";
return s;
}
public XidImpl(int formatId,
byte[] globalId, byte[] branchId, int hash, long localId){
this.formatId = formatId;
this.globalId = globalId;
this.branchId = branchId;
this.hash = hash;
this.localId = localId;
this.trulyGlobalId = (trulyGlobalIdsEnabled)
? new GlobalId(formatId, globalId)
: null;
}
/**
* Create a new instance with JBOSS_FORMAT_ID.
*/
public XidImpl(byte[] globalId, byte[] branchId, int hash, long localId){
this.formatId = FORMAT_ID;
this.globalId = globalId;
this.branchId = branchId;
this.hash = hash;
this.localId = localId;
this.trulyGlobalId = (trulyGlobalIdsEnabled)
? new GlobalId(FORMAT_ID, globalId, hash)
: null;
}
public XidImpl(final XidImpl xidImpl, final byte[] branchId){
this.formatId = xidImpl.formatId;
this.globalId = xidImpl.globalId;
this.branchId = branchId;
this.hash = xidImpl.hash;
this.localId = xidImpl.localId;
this.trulyGlobalId = (trulyGlobalIdsEnabled)
? xidImpl.trulyGlobalId
: null;
}
// retrun the Global TxId
//@Override
public byte[] getGlobalTransactionId(){
return (byte[])globalId.clone();
}
// return branch qualifier
//@Override
public byte[] getBranchQualifier(){
if (branchId.length == 0)
return branchId;
else
return (byte[])branchId.clone();
}
//@Override
public int getFormatId() {
return formatId;
}
/**
* checks for same format id, the same global transaction id
* and the same transaction branch qualifier.
*/
//@Override
public boolean equals(Object obj)
{
if(obj==this)
return true;
if (obj instanceof XidImpl) {
XidImpl other = (XidImpl)obj;
if (formatId != other.formatId ||
globalId.length != other.globalId.length ||
branchId.length != other.branchId.length)
return false;
for (int i = 0; i < globalId.length; ++i)
if (globalId[i] != other.globalId[i])
return false;
for (int i = 0; i < branchId.length; ++i)
if (branchId[i] != other.branchId[i])
return false;
return true;
}
return false;
}
@Override
public int hashCode(){
return hash;
}
@Override
public String toString(){
return toString(this);
}
public long getLocalIdValue() {
return localId;
}
public LocalId getLocalId() {
return new LocalId(localId);
}
public GlobalId getTrulyGlobalId() {
return trulyGlobalId;
}
public boolean sameTransaction(XidImpl other){
if(other == this)
return true;
if (formatId != other.formatId ||
globalId.length != other.globalId.length)
return false;
for (int i = 0; i < globalId.length; ++i)
if (globalId[i] != other.globalId[i])
return false;
return true;
}
//returns a reference to the global id byte array
public byte[] getInternalGlobalTransactionId(){
return globalId;
}
}