DS-Lab / src / main / java / dslab / protocol / dmtp / DmtpImpl.java
DmtpImpl.java
Raw
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<Address> 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;
    }
}