
com.undefinedlabs.scope.TraceId Maven / Gradle / Ivy
package com.undefinedlabs.scope;
import com.undefinedlabs.scope.utils.RandomUtils;
import com.undefinedlabs.scope.utils.Utils;
public class TraceId implements Comparable {
private static final int SIZE = 16;
private static final int BASE16_SIZE = 2 * BigendianEncoding.LONG_BASE16;
private static final long INVALID_ID = 0;
private static final TraceId INVALID = new TraceId(INVALID_ID, INVALID_ID);
// The internal representation of the TraceId.
private final long idHi;
private final long idLo;
public TraceId(final long idHi, final long idLo) {
this.idHi = idHi;
this.idLo = idLo;
}
public static int getSize() {
return SIZE;
}
public static TraceId getInvalid() {
return INVALID;
}
static TraceId generateRandomId() {
long idHi;
long idLo;
do {
idHi = RandomUtils.uniqueId();
idLo = RandomUtils.uniqueId();
} while (idHi == INVALID_ID && idLo == INVALID_ID);
return new TraceId(idHi, idLo);
}
public static TraceId fromBytes(final byte[] src, final int srcOffset) {
Utils.checkNotNull(src, "src");
return new TraceId(
BigendianEncoding.longFromByteArray(src, srcOffset),
BigendianEncoding.longFromByteArray(src, srcOffset + BigendianEncoding.LONG_BYTES));
}
public static TraceId fromLowerCaseBase16(final CharSequence src, final int srcOffset) {
Utils.checkNotNull(src, "src");
final String toConvert = "00000000000000000000000000000000".substring(src.length()) + src;
return new TraceId(
BigendianEncoding.longFromBase16String(toConvert, srcOffset),
BigendianEncoding.longFromBase16String(
toConvert, srcOffset + BigendianEncoding.LONG_BASE16));
}
public void copyLowerCaseBase16To(final char[] dest, final int destOffset) {
BigendianEncoding.longToBase16String(idHi, dest, destOffset);
BigendianEncoding.longToBase16String(idLo, dest, destOffset + BASE16_SIZE / 2);
}
public boolean isValid() {
return idHi != INVALID_ID || idLo != INVALID_ID;
}
public String toLowerCaseBase16() {
final char[] chars = new char[BASE16_SIZE];
copyLowerCaseBase16To(chars, 0);
return new String(chars);
}
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final TraceId that = (TraceId) o;
return idHi == that.idHi && idLo == that.idLo;
}
@Override
public int hashCode() {
// Copied from Arrays.hashCode(long[])
int result = 1;
result = 31 * result + ((int) (idHi ^ (idHi >>> 32)));
result = 31 * result + ((int) (idLo ^ (idLo >>> 32)));
return result;
}
@Override
public String toString() {
return "TraceId{traceId=" + toLowerCaseBase16() + "}";
}
@Override
public int compareTo(final TraceId that) {
if (idHi == that.idHi) {
if (idLo == that.idLo) {
return 0;
}
return idLo < that.idLo ? -1 : 1;
}
return idHi < that.idHi ? -1 : 1;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy