package org.skywalking.apm.trace.TraceId;

/**
 * The <code>DistributedTraceId</code> presents a distributed call chain.
 * <p>
 * This call chain has an unique (service) entrance,
 * <p>
 * such as: Service : http://www.skywalking.com/cust/query, all the services, called behind this service, rest services,
 * db executions, are using the same <code>DistributedTraceId</code> even in different JVM.
 * <p>
 * The <code>DistributedTraceId</code> contains only one string, and can NOT be reset, creating a new instance is the
 * only option.
 *
 * @author wusheng
 */
public abstract class DistributedTraceId {
    private String id;

    public DistributedTraceId(String id) {
        this.id = id;
    }

    public String get() {
        return id;
    }

    /**
     * Compare the two <code>DistributedTraceId</code> by its {@link #id},
     * even these two <code>DistributedTraceId</code>s are not the same instances.
     *
     * @param o target <code>DistributedTraceId</code>
     * @return return if they have the same {@link #id}
     */
    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;

        DistributedTraceId id1 = (DistributedTraceId) o;

        return id != null ? id.equals(id1.id) : id1.id == null;
    }

    @Override
    public int hashCode() {
        return id != null ? id.hashCode() : 0;
    }
}
