package dslab.routing; import java.io.Serializable; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.List; import java.util.Objects; import static java.lang.String.join; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Objects.requireNonNull; /** * Represents a domain, e.g. univer.ze */ public class Domain implements Comparable<Domain>, Serializable { private InetSocketAddress socketAddress; private final List<String> zones; public Domain(String domainname) { this.zones = domainname.isEmpty() ? emptyList() : asList(domainname.split("\\.")); } /** * @param zones of the domain to be constructed, e.g. {@code List.of("earth","planet")} */ public Domain(List<String> zones) { this.zones = zones; } /** * @return the root domain */ public static Domain root() { return new Domain(emptyList()); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Domain domain = (Domain) o; return zones.equals(domain.zones); } @Override public int hashCode() { return Objects.hash(zones, socketAddress); } public InetAddress getAddress() { return requireNonNull(socketAddress.getAddress()); } public void setAddress(InetSocketAddress socketAddress) { this.socketAddress = socketAddress; } public int getPort() { if (this.socketAddress == null) throw new IllegalStateException("Set resolved address first"); return socketAddress.getPort(); } @Override public String toString() { return zones.isEmpty() ? "root" : join(".", zones); } @Override public int compareTo(Domain o) { return toString().compareTo(o.toString()); } /** * @return the top level zone, e.g. 'vienna.earth.planet' |-> 'planet' */ public Domain getLast() { return new Domain(zones.get(zones.size() - 1)); } /** * @return the domain that consists of all subdomains except for the last, * e.g. vienna.univer.ze |-> vienna.univer */ public Domain getInit() { return new Domain(zones.subList(0, zones.size() - 1)); } public boolean isLeaf() { return zones.size() == 1; } }