package dslab.protocol.dmtp; import dslab.protocol.Message; import dslab.routing.Address; import dslab.routing.AddressResolutionException; import dslab.routing.DeliveryService; import java.util.List; import static java.lang.String.join; import static java.lang.Thread.currentThread; /** * Implementation of the processing logic for DMTP commands. This runs on transfer servers and * mailbox servers. */ public class DmtpImpl implements Dmtp { private Message message; private final DeliveryService deliveryService; /** * @param deliveryService to which constructed messages will be passed for delivery */ public DmtpImpl(DeliveryService deliveryService) { this.deliveryService = deliveryService; } @Override public void quit() { currentThread().interrupt(); //this is checked in for-loop } @Override public void send() throws NoOpenMessageException, InvalidMessageException { if (getMessage().hasMissingFields()) throw new InvalidMessageException("missing " + join(", ", getMessage().getMissingFields())); deliveryService.deliver(getMessage()); message = null; } @Override public void hash(String hash) throws NoOpenMessageException { // No logic here, according to the documentation section 3.4 // "Calculating a hash value for a message is done by the message client" getMessage().setHash(hash); } @Override public void data(String data) throws NoOpenMessageException { getMessage().setData(data); } @Override public void subject(String subject) throws NoOpenMessageException { getMessage().setSubject(subject); } @Override public void from(Address sender) throws NoOpenMessageException, AddressResolutionException { getMessage().setSender(sender); } @Override public int to(List
receivers) throws AddressResolutionException, NoOpenMessageException { var recipientCount = deliveryService.validateAddresses(receivers); getMessage().setRecipients(receivers); return recipientCount; } @Override public Message begin() { var oldMessage = message; message = new Message(); return oldMessage; } private Message getMessage() throws NoOpenMessageException { if (message == null) throw new NoOpenMessageException(); return message; } }