/**
* Copyright 2015-2017 The OpenZipkin Authors
*
* Licensed 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 zipkin;
import java.io.ObjectStreamException;
import java.io.Serializable;
import java.io.StreamCorruptedException;
import static zipkin.internal.Util.UTF_8;
import static zipkin.internal.Util.checkNotNull;
public final class DependencyLink implements Serializable { // for Spark jobs
private static final long serialVersionUID = 0L;
public static DependencyLink create(String parent, String child, long callCount) {
return new DependencyLink(parent, child, callCount);
}
/** parent service name (caller) */
public final String parent;
/** child service name (callee) */
public final String child;
/** calls made during the duration (in milliseconds) of this link */
public final long callCount;
DependencyLink(String parent, String child, long callCount) {
this.parent = checkNotNull(parent, "parent").toLowerCase();
this.child = checkNotNull(child, "child").toLowerCase();
this.callCount = callCount;
}
public Builder toBuilder() {
return new Builder(this);
}
public static Builder builder() {
return new Builder();
}
public static final class Builder {
private String parent;
private String child;
private long callCount;
Builder() {
}
Builder(DependencyLink source) {
this.parent = source.parent;
this.child = source.child;
this.callCount = source.callCount;
}
public Builder parent(String parent) {
this.parent = parent;
return this;
}
public Builder child(String child) {
this.child = child;
return this;
}
public Builder callCount(long callCount) {
this.callCount = callCount;
return this;
}
public DependencyLink build() {
return new DependencyLink(parent, child, callCount);
}
}
@Override
public String toString() {
return new String(Codec.JSON.writeDependencyLink(this), UTF_8);
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (o instanceof DependencyLink) {
DependencyLink that = (DependencyLink) o;
return (this.parent.equals(that.parent))
&& (this.child.equals(that.child))
&& (this.callCount == that.callCount);
}
return false;
}
@Override
public int hashCode() {
int h = 1;
h *= 1000003;
h ^= parent.hashCode();
h *= 1000003;
h ^= child.hashCode();
h *= 1000003;
h ^= (callCount >>> 32) ^ callCount;
return h;
}
// Since this is an immutable object, and we have thrift handy, defer to a serialization proxy.
final Object writeReplace() throws ObjectStreamException {
return new SerializedForm(Codec.THRIFT.writeDependencyLink(this));
}
static final class SerializedForm implements Serializable {
private static final long serialVersionUID = 0L;
private final byte[] bytes;
SerializedForm(byte[] bytes) {
this.bytes = bytes;
}
Object readResolve() throws ObjectStreamException {
try {
return Codec.THRIFT.readDependencyLink(bytes);
} catch (IllegalArgumentException e) {
throw new StreamCorruptedException(e.getMessage());
}
}
}
}