Fix bug where two recipients do not both receive the message
This commit is contained in:
parent
71fa4f6267
commit
8759834955
@ -22,11 +22,16 @@ public class DMTPConnection implements Runnable {
|
|||||||
|
|
||||||
private Message msg = new Message();
|
private Message msg = new Message();
|
||||||
|
|
||||||
private final ConcurrentHashMap<Email, LinkedList<Message>> messageStorage;
|
private final String domain;
|
||||||
|
|
||||||
public DMTPConnection(Socket connection, ConcurrentHashMap<Email, LinkedList<Message>> messageStorage) {
|
private final ConcurrentHashMap<Email, LinkedList<Message>> messageStorage;
|
||||||
|
private final ConcurrentHashMap<String, String> userStorage;
|
||||||
|
|
||||||
|
public DMTPConnection(Socket connection, ConcurrentHashMap<Email, LinkedList<Message>> messageStorage, ConcurrentHashMap<String, String> userStorage, String domain) {
|
||||||
this.socket = connection;
|
this.socket = connection;
|
||||||
this.messageStorage = messageStorage;
|
this.messageStorage = messageStorage;
|
||||||
|
this.userStorage = userStorage;
|
||||||
|
this.domain = domain;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -69,16 +74,22 @@ public class DMTPConnection implements Runnable {
|
|||||||
int count = 0;
|
int count = 0;
|
||||||
try {
|
try {
|
||||||
for (String emailAddress : emailAddresses) {
|
for (String emailAddress : emailAddresses) {
|
||||||
|
logger.info("Current email address in msg.getTo(): " + emailAddress);
|
||||||
Email add = new Email(emailAddress);
|
Email add = new Email(emailAddress);
|
||||||
if (!this.messageStorage.containsKey(add)) {
|
if (this.domain.equals(add.getDomain())) {
|
||||||
throw new UnknownRecipientException("error unknown recipient " + add.toString());
|
logger.info("Address " + emailAddress + " belongs to this domain " + this.domain);
|
||||||
|
if (!this.userStorage.containsKey(add.getUsername())) {
|
||||||
|
logger.info("Our userStorage in domain " + this.domain + " does not contain user " + add.getUsername());
|
||||||
|
out.println("error unknown recipient " + add.toString());
|
||||||
} else {
|
} else {
|
||||||
|
logger.info("Address " + add.toString() + " belongs to this domain and user exists. Adding address to msg.To() field");
|
||||||
msg.addTo(add);
|
msg.addTo(add);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
out.println("ok " + count);
|
out.println("ok " + count);
|
||||||
} catch (MalformedInputException | UnknownRecipientException e) {
|
} catch (MalformedInputException e) {
|
||||||
out.println(e.getMessage());
|
out.println(e.getMessage());
|
||||||
}
|
}
|
||||||
} else if ("from".equals(userInput.split("\\s+")[0])) {
|
} else if ("from".equals(userInput.split("\\s+")[0])) {
|
||||||
|
|||||||
@ -21,11 +21,15 @@ public class DMTPListener extends Thread {
|
|||||||
private final Logger logger = Logger.getLogger(DMTPListener.class.getName());
|
private final Logger logger = Logger.getLogger(DMTPListener.class.getName());
|
||||||
private final ArrayList<DMTPConnection> clients = new ArrayList<>();
|
private final ArrayList<DMTPConnection> clients = new ArrayList<>();
|
||||||
private final ExecutorService executorService = Executors.newCachedThreadPool();
|
private final ExecutorService executorService = Executors.newCachedThreadPool();
|
||||||
private final ConcurrentHashMap<Email, LinkedList<Message>> storage;
|
private final ConcurrentHashMap<Email, LinkedList<Message>> messageStorage;
|
||||||
|
private final ConcurrentHashMap<String, String> userStorage;
|
||||||
|
private final String domain;
|
||||||
|
|
||||||
public DMTPListener(ServerSocket serverSocket, ConcurrentHashMap<Email, LinkedList<Message>> storage) {
|
public DMTPListener(ServerSocket serverSocket, ConcurrentHashMap<Email, LinkedList<Message>> storage, ConcurrentHashMap<String, String> userStorage, String domain) {
|
||||||
this.serverSocket = serverSocket;
|
this.serverSocket = serverSocket;
|
||||||
this.storage = storage;
|
this.messageStorage = storage;
|
||||||
|
this.userStorage = userStorage;
|
||||||
|
this.domain = domain;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -35,7 +39,7 @@ public class DMTPListener extends Thread {
|
|||||||
try {
|
try {
|
||||||
Socket s = serverSocket.accept();
|
Socket s = serverSocket.accept();
|
||||||
logger.fine("Processing incoming socket " + s.toString());
|
logger.fine("Processing incoming socket " + s.toString());
|
||||||
DMTPConnection dmtpConnection = new DMTPConnection(s, storage);
|
DMTPConnection dmtpConnection = new DMTPConnection(s, messageStorage, userStorage, domain);
|
||||||
clients.add(dmtpConnection);
|
clients.add(dmtpConnection);
|
||||||
executorService.submit(dmtpConnection);
|
executorService.submit(dmtpConnection);
|
||||||
} catch (InterruptedIOException | SocketException e) {
|
} catch (InterruptedIOException | SocketException e) {
|
||||||
|
|||||||
@ -73,7 +73,7 @@ public class MailboxServer implements IMailboxServer, Runnable {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
shutdown();
|
shutdown();
|
||||||
}
|
}
|
||||||
this.dmtpListener = new DMTPListener(this.dmtpServerSocket, this.messageStorage);
|
this.dmtpListener = new DMTPListener(this.dmtpServerSocket, this.messageStorage, this.userStorage, this.domain);
|
||||||
this.dmtpListener.start();
|
this.dmtpListener.start();
|
||||||
this.dmapListener = new DMAPListener(this.dmapServerSocket, this.messageStorage, this.userStorage);
|
this.dmapListener = new DMAPListener(this.dmapServerSocket, this.messageStorage, this.userStorage);
|
||||||
this.dmapListener.start();
|
this.dmapListener.start();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user