package cassandra.metadata; import cassandra.cql.Row; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import java.net.InetAddress; import java.util.Collections; import java.util.Set; import java.util.UUID; public class PeerMetadata extends MetadataEntity { private final Metadata metadata; private final InetAddress address; private final String datacenter; private final String rack; private final UUID hostId; private final String releaseVersion; private final UUID schemaVersion; private final Set<String> tokens; private final boolean down; public static class Builder { protected Metadata metadata; protected InetAddress address; protected String datacenter; protected String rack; protected UUID hostId; protected String releaseVersion; protected UUID schemaVersion; protected Set<String> tokens; protected boolean down; public Builder setMetadata(Metadata metadata) { this.metadata = metadata; return this; } public Builder setAddress(InetAddress address) { this.address = address; return this; } public Builder setDatacenter(String datacenter) { this.datacenter = datacenter; return this; } public Builder setRack(String rack) { this.rack = rack; return this; } public Builder setHostId(UUID hostId) { this.hostId = hostId; return this; } public Builder setReleaseVersion(String releaseVersion) { this.releaseVersion = releaseVersion; return this; } public Builder setSchemaVersion(UUID schemaVersion) { this.schemaVersion = schemaVersion; return this; } public Builder setTokens(Set<String> tokens) { this.tokens = tokens; return this; } public Builder setDown(boolean down) { this.down = down; return this; } public Builder mergeFrom(Metadata metadata, Row row) { setMetadata(metadata); setAddress(row.getInet("peer")); setDatacenter(row.getString("data_center")); setRack("rack"); setHostId(row.getUUID("host_id")); setReleaseVersion(row.getString("release_version")); setSchemaVersion(row.getUUID("schema_version")); setTokens(row.getSet("tokens", String.class)); return this; } public Builder mergeFrom(PeerMetadata peer) { setMetadata(peer.metadata); setAddress(peer.address); setDatacenter(peer.datacenter); setRack(peer.rack); setHostId(peer.hostId); setReleaseVersion(peer.releaseVersion); setSchemaVersion(peer.schemaVersion); setTokens(peer.tokens); setDown(peer.down); return this; } public PeerMetadata build() { return new PeerMetadata(this); } } public static Builder newBuilder() { return new Builder(); } public PeerMetadata(Builder builder) { metadata = builder.metadata; address = builder.address; datacenter = builder.datacenter; rack = builder.rack; hostId = builder.hostId; releaseVersion = builder.releaseVersion; schemaVersion = builder.schemaVersion; tokens = Collections.unmodifiableSet(builder.tokens); down = builder.down; } @JsonIgnore public Metadata getMetadata() { return metadata; } @JsonProperty("peer") public InetAddress getAddress() { return address; } @JsonIgnore public boolean hasDatacenter() { return datacenter != null && !datacenter.isEmpty(); } @JsonProperty("data_center") public String getDatacenter() { return datacenter; } @JsonIgnore public boolean hasRack() { return rack != null && !rack.isEmpty(); } public String getRack() { return rack; } public UUID getHostId() { return hostId; } public String getReleaseVersion() { return releaseVersion; } public UUID getSchemaVersion() { return schemaVersion; } public Set<String> getTokens() { return tokens; } @JsonIgnore public boolean isUp() { return !down; } @JsonIgnore public boolean isDown() { return down; } @Override public int hashCode() { return address.hashCode(); } @Override public boolean equals(Object o) { return o instanceof PeerMetadata && getAddress().equals(((PeerMetadata)o).getAddress()); } @Override public String toString() { String status = "UP"; if (down) { status = "DOWN"; } if (datacenter != null && rack != null) { return String.format("[cluster: %s, addr: %s, dc: %s, rack: %s, status: %s]", metadata.getClusterName(), address, datacenter, rack, status); } else { return String.format("[cluster: %s, addr: %s, status: %s]", metadata.getClusterName(), address, status); } } }