diff --git a/src/main/java/dslab/mailbox/MailboxServer.java b/src/main/java/dslab/mailbox/MailboxServer.java index eb5360a..222510b 100644 --- a/src/main/java/dslab/mailbox/MailboxServer.java +++ b/src/main/java/dslab/mailbox/MailboxServer.java @@ -3,7 +3,13 @@ package dslab.mailbox; import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; +import java.net.InetAddress; import java.net.ServerSocket; +import java.net.UnknownHostException; +import java.rmi.NotBoundException; +import java.rmi.RemoteException; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; import java.util.LinkedList; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; @@ -15,6 +21,9 @@ import at.ac.tuwien.dsg.orvell.annotation.Command; import dslab.ComponentFactory; import dslab.Email; import dslab.Message; +import dslab.nameserver.AlreadyRegisteredException; +import dslab.nameserver.INameserverRemote; +import dslab.nameserver.InvalidDomainException; import dslab.util.Config; public class MailboxServer implements IMailboxServer, Runnable { @@ -31,6 +40,9 @@ public class MailboxServer implements IMailboxServer, Runnable { private final ConcurrentHashMap> messageStorage = new ConcurrentHashMap<>(); private final ConcurrentHashMap userStorage = new ConcurrentHashMap<>(); + private Registry registry; + private INameserverRemote nameserverRemote; + public static volatile Integer id; @@ -65,6 +77,19 @@ public class MailboxServer implements IMailboxServer, Runnable { this.dmtpServerPort = config.getInt("dmtp.tcp.port"); this.dmapServerPort = config.getInt("dmap.tcp.port"); logger.setLevel(Level.ALL); + + // registry + String registryName = config.getString("root_id"); + String registryHost = config.getString("registry.host"); + int registryPort = config.getInt("registry.port"); + try { + registry = LocateRegistry.getRegistry(registryHost, registryPort); + nameserverRemote = (INameserverRemote) registry.lookup(registryName); + String localIp = InetAddress.getLocalHost().getHostAddress(); + nameserverRemote.registerMailboxServer(domain, localIp + ":" + this.dmtpServerPort); + } catch (RemoteException | NotBoundException | InvalidDomainException | AlreadyRegisteredException | UnknownHostException e) { + e.printStackTrace(); + } } @Override diff --git a/src/main/java/dslab/nameserver/NameServerRemote.java b/src/main/java/dslab/nameserver/NameServerRemote.java index ae95a41..24dd25f 100644 --- a/src/main/java/dslab/nameserver/NameServerRemote.java +++ b/src/main/java/dslab/nameserver/NameServerRemote.java @@ -5,21 +5,34 @@ import java.rmi.RemoteException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; public class NameServerRemote implements INameserverRemote, Serializable { private String name; private ConcurrentHashMap subdomains; + private ConcurrentHashMap addresses; public NameServerRemote(String name) { this.name = name; this.subdomains = new ConcurrentHashMap<>(); + this.addresses = new ConcurrentHashMap<>(); } public List getNameservers() { return new ArrayList<>(subdomains.keySet()); } + public String getAddresses() { + StringBuilder stringBuilder = new StringBuilder(); + AtomicInteger count = new AtomicInteger(0); + addresses.forEach((x, y) -> stringBuilder + .append(count.incrementAndGet()).append(".").append(" ") + .append(x).append(" ") + .append(y).append("\n")); + return stringBuilder.toString(); + } + @Override public void registerNameserver(String domain, INameserverRemote nameserver) throws RemoteException, AlreadyRegisteredException, InvalidDomainException { // System.out.printf("Registering Nameserver %s%n", domain); @@ -40,7 +53,16 @@ public class NameServerRemote implements INameserverRemote, Serializable { @Override public void registerMailboxServer(String domain, String address) throws RemoteException, AlreadyRegisteredException, InvalidDomainException { - + if (!domain.contains(".")) { + addresses.putIfAbsent(domain, address); + } else { + String[] domainParts = domain.split("\\."); + String topDomain = domainParts[domainParts.length - 1]; + INameserverRemote topDomainNameServer = subdomains.get(topDomain); + String subdomainsString = domain.substring(0, domain.length() - topDomain.length() - 1); + topDomainNameServer.registerMailboxServer(subdomainsString, address); + addresses.forEach((k, v) -> System.out.println(k + " " + v)); + } } @Override diff --git a/src/main/java/dslab/nameserver/Nameserver.java b/src/main/java/dslab/nameserver/Nameserver.java index 0296e2f..e051d79 100644 --- a/src/main/java/dslab/nameserver/Nameserver.java +++ b/src/main/java/dslab/nameserver/Nameserver.java @@ -74,6 +74,7 @@ public class Nameserver implements INameserver { shell = new Shell(in, out) .register("nameservers", ((input, context) -> this.nameservers())) + .register("addresses", ((input, context) -> this.addresses())) .register("shutdown", (((input, context) -> { System.out.println("shutting down..."); this.shutdown(); @@ -95,7 +96,7 @@ public class Nameserver implements INameserver { @Override public void addresses() { - // TODO + this.out.println(nameServerLocal.getAddresses()); } @Override