package dslab.nameserver;
import dslab.routing.Domain;
import java.net.InetSocketAddress;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* The remote object of a nameserver which can be called via RMI.
*/
public interface INameserverRemote extends Remote {
/**
* Registers a name server with the given address for the given domain. For example, when registering a
* nameserver for the domain 'earth.planet', the new nameserver first calls the root nameserver with the argument
* 'earth.planet'. The root nameserver locates the nameserver for 'planet' via its child-nameserver references, and
* invokes this method with the remainder of the domain (i.e., 'earth'). Because 'earth' is then the leaf zone, the
* current nameserver ('planet') stores the reference in its child-nameserver references.
*
* @param domain the domain
* @param nameserver the nameserver's remote object
* @throws RemoteException RMI exception (declaration required by RMI)
* @throws AlreadyRegisteredException if the given domain is already registered
* @throws InvalidDomainException if the domain is invalid (e.g., due to a syntax error, or a required intermediary
* nameserver was not found)
*/
void registerNameserver(String domain, INameserverRemote nameserver) throws RemoteException,
AlreadyRegisteredException, InvalidDomainException;
/**
* Registers a mailbox server with the given address for the given domain.
*
* @param domain the mail domain, e.g. vienna.earth.planet
* @param address the socket address of the mailbox server's DMTP socket, e.g., 127.0.0.1:16503
* @throws RemoteException RMI exception (declaration required by RMI)
* @throws AlreadyRegisteredException if the given domain is already in use
* @throws InvalidDomainException if the domain is invalid (e.g., due to a syntax error, or the responsible
* nameserver was not found)
*/
void registerMailboxServer(String domain, String address) throws RemoteException, AlreadyRegisteredException,
InvalidDomainException;
/**
* Returns a reference to the remote object of the ns for the given zone. For example, if called with the argument
* 'earth' on the remote object of zone 'planet', the call returns the reference to the nameserver of the zone
* 'earth.planet'.
*
* @param zone the child zone, e.g. earth
* @return the remote object reference of the given zone, or null
if it does not exist
* @throws RemoteException RMI exception (declaration required by RMI)
*/
INameserverRemote getNameserver(String zone) throws RemoteException;
/**
* @param username
* @return
* @throws RemoteException
*/
String lookup(String username) throws RemoteException;
Collection getSortedZones() throws RemoteException;
List> getMailboxserverAddresses() throws RemoteException;
}