package mireka.pop.command;
import static mireka.pop.SessionState.*;
import java.io.IOException;
import mireka.login.Principal;
import mireka.pop.Command;
import mireka.pop.CommandParser;
import mireka.pop.Pop3Exception;
import mireka.pop.Session;
import mireka.pop.store.Maildrop;
import mireka.pop.store.MaildropLockedException;
import mireka.pop.store.MaildropPopException;
/**
 * Base class for commands which authenticate a user, it provides a function for
 * going into the Transaction state by locking the maildrop associated with the
 * user.
 */
public abstract class AbstractLoginCommand implements Command {
    protected final Session session;
    public abstract void execute(CommandParser commandParser)
            throws IOException, Pop3Exception;
    public AbstractLoginCommand(Session session) {
        this.session = session;
    }
    protected void startTransaction(Principal userPrincipal)
            throws MaildropPopException, IOException {
        String maildropName =
                session.getServer().getPrincipalMaildropTable()
                        .lookupMaildropName(userPrincipal);
        Maildrop maildrop =
                session.getServer().getMaildropRepository()
                        .borrowMaildrop(maildropName);
        try {
            maildrop.beginTransaction();
        } catch (MaildropLockedException e) {
            session.setSessionState(AUTHORIZATION);
            session.getServer().getMaildropRepository()
                    .releaseMaildrop(maildrop);
            session.getThread().sendResponse(e.toResponse());
            return;
        } catch (MaildropPopException e) {
            session.getServer().getMaildropRepository()
                    .releaseMaildrop(maildrop);
            throw e;
        }
        session.setMaildrop(maildrop);
        session.setSessionState(TRANSACTION);
        session.getThread().sendResponse("+OK Maildrop locked and ready");
    }
}