All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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