Search in sources :

Example 1 with MessageRange

use of org.apache.james.mailbox.model.MessageRange in project i2p.i2p-bote by i2p.

the class MapperFactory method createMessageMapper.

@Override
public MessageMapper createMessageMapper(MailboxSession mailboxSession) throws MailboxException {
    return new AbstractMessageMapper(mailboxSession, uidProvider, modSeqProvider) {

        @Override
        public long countMessagesInMailbox(Mailbox mailbox) throws MailboxException {
            String mailboxName = mailbox.getName().toLowerCase();
            BoteMailbox boteMailbox = getMailboxes().get(mailboxName);
            return boteMailbox == null ? -1 : boteMailbox.getNumMessages();
        }

        @Override
        public long countUnseenMessagesInMailbox(Mailbox mailbox) throws MailboxException {
            int count = 0;
            BoteMailbox boteMailbox = (BoteMailbox) mailbox;
            for (BoteMessage message : boteMailbox.getAllMessages()) if (!message.isSeen())
                count++;
            return count;
        }

        @Override
        public void delete(Mailbox mailbox, MailboxMessage message) throws MailboxException {
            EmailFolder folder = ((BoteMailbox) mailbox).getFolder();
            MessageId messageId = message.getMessageId();
            boolean deleted = folderManager.deleteEmail(folder, messageId.serialize());
            if (!deleted)
                log.error("Can't delete Message " + messageId + " from folder " + folder);
        }

        @Override
        public Map<MessageUid, MessageMetaData> expungeMarkedForDeletionInMailbox(Mailbox mailbox, MessageRange set) throws MailboxException {
            final Map<MessageUid, MessageMetaData> filteredResult = new HashMap<>();
            Iterator<MailboxMessage> it = findInMailbox(mailbox, set, FetchType.Metadata, -1);
            while (it.hasNext()) {
                MailboxMessage message = it.next();
                if (message.isDeleted()) {
                    filteredResult.put(message.getUid(), new SimpleMessageMetaData(message));
                    delete(mailbox, message);
                }
            }
            return filteredResult;
        }

        @Override
        public MessageUid findFirstUnseenMessageUid(Mailbox mailbox) throws MailboxException {
            BoteMailbox boteMailbox = (BoteMailbox) mailbox;
            for (BoteMessage message : boteMailbox.getAllMessages()) if (!message.isSeen())
                return message.getUid();
            return null;
        }

        @Override
        public Iterator<MailboxMessage> findInMailbox(Mailbox mailbox, MessageRange set, FetchType type, int limit) throws MailboxException {
            BoteMailbox boteBox = (BoteMailbox) mailbox;
            return boteBox.getMessages(set, limit).iterator();
        }

        @Override
        public List<MessageUid> findRecentMessageUidsInMailbox(Mailbox mailbox) throws MailboxException {
            final List<MessageUid> results = new ArrayList<>();
            BoteMailbox boteMailbox = (BoteMailbox) mailbox;
            for (BoteMessage message : boteMailbox.getAllMessages()) if (message.isRecent())
                results.add(message.getUid());
            Collections.sort(results);
            return results;
        }

        @Override
        public void endRequest() {
        }

        @Override
        public MessageMetaData copy(Mailbox mailbox, MessageUid uid, long modSeq, MailboxMessage original) throws MailboxException {
            BoteMailbox boteBox = (BoteMailbox) mailbox;
            try {
                BoteMessage newMessage = new BoteMessage((BoteMessage) original);
                newMessage.setUid(uid);
                newMessage.setModSeq(modSeq);
                Flags flags = original.createFlags();
                // Mark message as recent as it is a copy
                flags.add(Flag.RECENT);
                newMessage.setFlags(flags);
                boteBox.add(newMessage);
                return new SimpleMessageMetaData(newMessage);
            } catch (Exception e) {
                throw new MailboxException("Can't copy message [" + original + "] to folder [" + mailbox + "]");
            }
        }

        @Override
        public MessageMetaData move(Mailbox mailbox, MailboxMessage message) throws MailboxException {
            MessageMetaData metadata = copy(mailbox, message);
            delete(mailbox, message);
            return metadata;
        }

        @Override
        public Flags getApplicableFlag(Mailbox mailbox) throws MailboxException {
            Flags flags = new Flags();
            flags.add(Flag.ANSWERED);
            flags.add(Flag.DELETED);
            flags.add(Flag.RECENT);
            flags.add(Flag.SEEN);
            return flags;
        }

        /**
         * Updates the metadata
         */
        @Override
        protected MessageMetaData save(Mailbox mailbox, MailboxMessage message) throws MailboxException {
            // (I2P-Bote does this already, plus the email shouldn't show up in "sent" until it's actually been sent to the DHT)
            if (!(message instanceof BoteMessage))
                return new SimpleMessageMetaData(message);
            BoteMailbox boteBox = (BoteMailbox) mailbox;
            BoteMessage boteMessage = (BoteMessage) message;
            try {
                boteBox.saveMetadata(boteMessage);
                return new SimpleMessageMetaData(message);
            } catch (Exception e) {
                throw new MailboxException("Can't add message to folder " + boteBox.getFolder(), e);
            }
        }

        @Override
        protected void begin() throws MailboxException {
        // not implemented for now
        }

        @Override
        protected void commit() throws MailboxException {
        // not implemented for now
        }

        @Override
        protected void rollback() throws MailboxException {
        // not implemented for now
        }
    };
}
Also used : MessageMetaData(org.apache.james.mailbox.model.MessageMetaData) SimpleMessageMetaData(org.apache.james.mailbox.store.SimpleMessageMetaData) MailboxException(org.apache.james.mailbox.exception.MailboxException) MessageUid(org.apache.james.mailbox.MessageUid) HashMap(java.util.HashMap) SimpleMessageMetaData(org.apache.james.mailbox.store.SimpleMessageMetaData) ArrayList(java.util.ArrayList) Flags(javax.mail.Flags) MailboxException(org.apache.james.mailbox.exception.MailboxException) MailboxNotFoundException(org.apache.james.mailbox.exception.MailboxNotFoundException) SubscriptionException(org.apache.james.mailbox.exception.SubscriptionException) Mailbox(org.apache.james.mailbox.store.mail.model.Mailbox) MessageRange(org.apache.james.mailbox.model.MessageRange) AbstractMessageMapper(org.apache.james.mailbox.store.mail.AbstractMessageMapper) MailboxMessage(org.apache.james.mailbox.store.mail.model.MailboxMessage) EmailFolder(i2p.bote.folder.EmailFolder) MessageId(org.apache.james.mailbox.model.MessageId)

Aggregations

EmailFolder (i2p.bote.folder.EmailFolder)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 Flags (javax.mail.Flags)1 MessageUid (org.apache.james.mailbox.MessageUid)1 MailboxException (org.apache.james.mailbox.exception.MailboxException)1 MailboxNotFoundException (org.apache.james.mailbox.exception.MailboxNotFoundException)1 SubscriptionException (org.apache.james.mailbox.exception.SubscriptionException)1 MessageId (org.apache.james.mailbox.model.MessageId)1 MessageMetaData (org.apache.james.mailbox.model.MessageMetaData)1 MessageRange (org.apache.james.mailbox.model.MessageRange)1 SimpleMessageMetaData (org.apache.james.mailbox.store.SimpleMessageMetaData)1 AbstractMessageMapper (org.apache.james.mailbox.store.mail.AbstractMessageMapper)1 Mailbox (org.apache.james.mailbox.store.mail.model.Mailbox)1 MailboxMessage (org.apache.james.mailbox.store.mail.model.MailboxMessage)1