/**
   * @see
   *     org.apache.james.imap.processor.PermitEnableCapabilityProcessor#enable(org.apache.james.imap.api.ImapMessage,
   *     org.apache.james.imap.api.process.ImapProcessor.Responder,
   *     org.apache.james.imap.api.process.ImapSession, java.lang.String)
   */
  public void enable(
      ImapMessage message, Responder responder, ImapSession session, String capability)
      throws EnableException {

    if (EnableProcessor.getEnabledCapabilities(session).contains(capability) == false) {
      SelectedMailbox sm = session.getSelected();
      // Send a HIGHESTMODSEQ response if the there was a select mailbox before and the client just
      // enabled
      // QRESYNC or CONDSTORE
      //
      // See http://www.dovecot.org/list/dovecot/2008-March/029561.html
      if (capability.equalsIgnoreCase(ImapConstants.SUPPORTS_CONDSTORE)
          || capability.equalsIgnoreCase(ImapConstants.SUPPORTS_QRESYNC)) {
        try {
          MetaData metaData = null;
          boolean send = false;
          if (sm != null) {
            MessageManager mailbox = getSelectedMailbox(session);
            metaData =
                mailbox.getMetaData(
                    false, ImapSessionUtils.getMailboxSession(session), FetchGroup.NO_COUNT);
            send = true;
          }
          condstoreEnablingCommand(session, responder, metaData, send);
        } catch (MailboxException e) {
          throw new EnableException("Unable to enable " + capability, e);
        }
      }
    }
  }
  private MessageManager.MetaData selectMailbox(MailboxPath mailboxPath, ImapSession session)
      throws MailboxException {
    final MailboxManager mailboxManager = getMailboxManager();
    final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
    final MessageManager mailbox = mailboxManager.getMailbox(mailboxPath, mailboxSession);

    final SelectedMailbox sessionMailbox;
    final SelectedMailbox currentMailbox = session.getSelected();
    if (currentMailbox == null || !currentMailbox.getPath().equals(mailboxPath)) {

      // QRESYNC EXTENSION
      //
      // Response with the CLOSE return-code when the currently selected mailbox is closed
      // implicitly using the SELECT/EXAMINE command on another mailbox
      //
      // See rfc5162 3.7. CLOSED Response Code
      if (currentMailbox != null) {
        getStatusResponseFactory()
            .untaggedOk(HumanReadableText.QRESYNC_CLOSED, ResponseCode.closed());
      }
      session.selected(new SelectedMailboxImpl(getMailboxManager(), session, mailboxPath));

      sessionMailbox = session.getSelected();

    } else {
      // TODO: Check if we need to handle CONDSTORE there too
      sessionMailbox = currentMailbox;
    }
    final MessageManager.MetaData metaData =
        mailbox.getMetaData(
            !openReadOnly, mailboxSession, MessageManager.MetaData.FetchGroup.FIRST_UNSEEN);
    addRecent(metaData, sessionMailbox);
    return metaData;
  }