DS-Lab / src / main / java / dslab / routing / Domain.java
Domain.java
Raw
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;
    }
}