org.apache.activemq.artemis.jms.example.DummyXid Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.activemq.artemis.jms.example;
import javax.transaction.xa.Xid;
import org.apache.activemq.artemis.utils.Base64;
public class DummyXid implements Xid {
private static final long serialVersionUID = 407053232840068514L;
private final byte[] branchQualifier;
private final int formatId;
private final byte[] globalTransactionId;
private int hash;
private boolean hashCalculated;
// Static --------------------------------------------------------
public static String toBase64String(final Xid xid) {
return Base64.encodeBytes(DummyXid.toByteArray(xid));
}
private static byte[] toByteArray(final Xid xid) {
byte[] branchQualifier = xid.getBranchQualifier();
byte[] globalTransactionId = xid.getGlobalTransactionId();
int formatId = xid.getFormatId();
byte[] hashBytes = new byte[branchQualifier.length + globalTransactionId.length + 4];
System.arraycopy(branchQualifier, 0, hashBytes, 0, branchQualifier.length);
System.arraycopy(globalTransactionId, 0, hashBytes, branchQualifier.length, globalTransactionId.length);
byte[] intBytes = new byte[4];
for (int i = 0; i < 4; i++) {
intBytes[i] = (byte) ((formatId >> i * 8) % 0xFF);
}
System.arraycopy(intBytes, 0, hashBytes, branchQualifier.length + globalTransactionId.length, 4);
return hashBytes;
}
// Constructors --------------------------------------------------
/**
* Standard constructor
*
* @param branchQualifier
* @param formatId
* @param globalTransactionId
*/
public DummyXid(final byte[] branchQualifier, final int formatId, final byte[] globalTransactionId) {
this.branchQualifier = branchQualifier;
this.formatId = formatId;
this.globalTransactionId = globalTransactionId;
}
/**
* Copy constructor
*
* @param other
*/
public DummyXid(final Xid other) {
branchQualifier = copyBytes(other.getBranchQualifier());
formatId = other.getFormatId();
globalTransactionId = copyBytes(other.getGlobalTransactionId());
}
// Xid implementation ------------------------------------------------------------------
@Override
public byte[] getBranchQualifier() {
return branchQualifier;
}
@Override
public int getFormatId() {
return formatId;
}
@Override
public byte[] getGlobalTransactionId() {
return globalTransactionId;
}
// Public -------------------------------------------------------------------------------
@Override
public int hashCode() {
if (!hashCalculated) {
calcHash();
}
return hash;
}
@Override
public boolean equals(final Object other) {
if (this == other) {
return true;
}
if (!(other instanceof Xid)) {
return false;
}
Xid xother = (Xid) other;
if (xother.getFormatId() != formatId) {
return false;
}
if (xother.getBranchQualifier().length != branchQualifier.length) {
return false;
}
if (xother.getGlobalTransactionId().length != globalTransactionId.length) {
return false;
}
for (int i = 0; i < branchQualifier.length; i++) {
byte[] otherBQ = xother.getBranchQualifier();
if (branchQualifier[i] != otherBQ[i]) {
return false;
}
}
for (int i = 0; i < globalTransactionId.length; i++) {
byte[] otherGtx = xother.getGlobalTransactionId();
if (globalTransactionId[i] != otherGtx[i]) {
return false;
}
}
return true;
}
@Override
public String toString() {
return "XidImpl (" + System.identityHashCode(this) +
" bq:" +
stringRep(branchQualifier) +
" formatID:" +
formatId +
" gtxid:" +
stringRep(globalTransactionId);
}
// Private -------------------------------------------------------------------------------
private String stringRep(final byte[] bytes) {
StringBuilder buff = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
byte b = bytes[i];
buff.append(b);
if (i != bytes.length - 1) {
buff.append('.');
}
}
return buff.toString();
}
private void calcHash() {
byte[] hashBytes = org.apache.activemq.artemis.jms.example.DummyXid.toByteArray(this);
String s = new String(hashBytes);
hash = s.hashCode();
hashCalculated = true;
}
private byte[] copyBytes(final byte[] other) {
byte[] bytes = new byte[other.length];
System.arraycopy(other, 0, bytes, 0, other.length);
return bytes;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy