You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2016/08/29 13:28:11 UTC

[14/17] james-project git commit: JAMES-1818 Remove store usage in message creation by using managers

http://git-wip-us.apache.org/repos/asf/james-project/blob/f1116e2d/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/message/MimePartParser.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/message/MimePartParser.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/message/MimePartParser.java
deleted file mode 100644
index 5e085b2..0000000
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/message/MimePartParser.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.jmap.model.message;
-
-import com.google.common.base.Preconditions;
-import org.apache.james.mailbox.store.extractor.TextExtractor;
-import org.apache.james.mailbox.store.mail.model.Message;
-import org.apache.james.mime4j.MimeException;
-import org.apache.james.mime4j.message.DefaultBodyDescriptorBuilder;
-import org.apache.james.mime4j.message.MaximalBodyDescriptor;
-import org.apache.james.mime4j.stream.EntityState;
-import org.apache.james.mime4j.stream.MimeConfig;
-import org.apache.james.mime4j.stream.MimeTokenStream;
-
-import java.io.IOException;
-import java.util.Deque;
-import java.util.LinkedList;
-
-public class MimePartParser {
-
-    private final Message message;
-    private final TextExtractor textExtractor;
-    private final MimeTokenStream stream;
-    private final Deque<MimePartContainerBuilder> builderStack;
-    private MimePart result;
-    private MimePartContainerBuilder currentlyBuildMimePart;
-
-    public MimePartParser(Message message, TextExtractor textExtractor) {
-        this.message = message;
-        this.textExtractor = textExtractor;
-        this.builderStack = new LinkedList<>();
-        this.currentlyBuildMimePart = new RootMimePartContainerBuilder();
-        this.stream = new MimeTokenStream(
-            MimeConfig.custom().setMaxLineLen(-1).setMaxHeaderLen(-1).build(),
-            new DefaultBodyDescriptorBuilder());
-    }
-
-    public MimePart parse() throws IOException, MimeException {
-        stream.parse(message.getFullContent());
-        for (EntityState state = stream.getState(); state != EntityState.T_END_OF_STREAM; state = stream.next()) {
-            processMimePart(stream, state);
-        }
-        return result;
-    }
-
-    private void processMimePart(MimeTokenStream stream, EntityState state) throws IOException {
-        switch (state) {
-            case T_START_MULTIPART:
-            case T_START_MESSAGE:
-                stackCurrent();
-                break;
-            case T_START_HEADER:
-                currentlyBuildMimePart = MimePart.builder();
-                break;
-            case T_FIELD:
-                currentlyBuildMimePart.addToHeaders(stream.getField());
-                break;
-            case T_BODY:
-                manageBodyExtraction(stream);
-                closeMimePart();
-                break;
-            case T_END_MULTIPART:
-            case T_END_MESSAGE:
-                unstackToCurrent();
-                closeMimePart();
-                break;
-            default:
-                break;
-        }
-    }
-
-    private void stackCurrent() {
-        builderStack.push(currentlyBuildMimePart);
-        currentlyBuildMimePart = null;
-    }
-
-    private void unstackToCurrent() {
-        currentlyBuildMimePart = builderStack.pop();
-    }
-    
-    private void closeMimePart() {
-        MimePart bodyMimePart = currentlyBuildMimePart.using(textExtractor).build();
-        if (!builderStack.isEmpty()) {
-            builderStack.peek().addChild(bodyMimePart);
-        } else {
-            Preconditions.checkState(result == null);
-            result = bodyMimePart;
-        }
-    }
-
-    private void manageBodyExtraction(MimeTokenStream stream) throws IOException {
-        extractMimePartBodyDescription(stream);
-        currentlyBuildMimePart.addBodyContent(stream.getDecodedInputStream());
-    }
-
-    private void extractMimePartBodyDescription(MimeTokenStream stream) {
-        final MaximalBodyDescriptor descriptor = (MaximalBodyDescriptor) stream.getBodyDescriptor();
-        currentlyBuildMimePart.addMediaType(descriptor.getMediaType())
-            .addSubType(descriptor.getSubType())
-            .addContentDisposition(descriptor.getContentDispositionType())
-            .addFileName(descriptor.getContentDispositionFilename());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/f1116e2d/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/message/RootMimePartContainerBuilder.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/message/RootMimePartContainerBuilder.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/message/RootMimePartContainerBuilder.java
deleted file mode 100644
index 60d81e8..0000000
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/message/RootMimePartContainerBuilder.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.jmap.model.message;
-
-import org.apache.james.mailbox.store.extractor.TextExtractor;
-import org.apache.james.mime4j.stream.Field;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.InputStream;
-
-public class RootMimePartContainerBuilder implements MimePartContainerBuilder {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(RootMimePartContainerBuilder.class);
-
-    private MimePart rootMimePart;
-
-    @Override
-    public MimePart build() {
-        return rootMimePart;
-    }
-
-    @Override public MimePartContainerBuilder using(TextExtractor textExtractor) {
-        return this;
-    }
-
-    @Override
-    public MimePartContainerBuilder addToHeaders(Field field) {
-        LOGGER.warn("Trying to add headers to the Root MimePart container");
-        return this;
-    }
-
-    @Override
-    public MimePartContainerBuilder addBodyContent(InputStream bodyContent) {
-        LOGGER.warn("Trying to add body content to the Root MimePart container");
-        return this;
-    }
-
-    @Override
-    public MimePartContainerBuilder addChild(MimePart mimePart) {
-        if (rootMimePart == null) {
-            rootMimePart = mimePart;
-        } else {
-            LOGGER.warn("Trying to add several children to the Root MimePart container");
-        }
-        return this;
-    }
-
-    @Override
-    public MimePartContainerBuilder addFileName(String fileName) {
-        LOGGER.warn("Trying to add fineName to the Root MimePart container");
-        return this;
-    }
-
-    @Override
-    public MimePartContainerBuilder addMediaType(String mediaType) {
-        LOGGER.warn("Trying to add media type to the Root MimePart container");
-        return this;
-    }
-
-    @Override
-    public MimePartContainerBuilder addSubType(String subType) {
-        LOGGER.warn("Trying to add sub type to the Root MimePart container");
-        return this;
-    }
-
-    @Override
-    public MimePartContainerBuilder addContentDisposition(String contentDisposition) {
-        LOGGER.warn("Trying to add content disposition to the Root MimePart container");
-        return this;
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/f1116e2d/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java
index a128007..7739971 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java
@@ -30,7 +30,7 @@ import javax.mail.internet.AddressException;
 import org.apache.james.core.MailImpl;
 import org.apache.james.jmap.model.Emailer;
 import org.apache.james.jmap.model.Message;
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.jmap.model.MessageFactory.MetaDataWithContent;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
 import org.slf4j.Logger;
@@ -47,7 +47,7 @@ public class MailFactory {
     @VisibleForTesting MailFactory() {
     }
 
-    public Mail build(MailboxMessage mailboxMessage, Message jmapMessage) throws MessagingException, IOException {
+    public Mail build(MetaDataWithContent message, Message jmapMessage) throws MessagingException, IOException {
         MailAddress sender = jmapMessage.getFrom()
                 .map(this::emailerToMailAddress)
                 .orElseThrow(() -> new RuntimeException("Sender is mandatory"));
@@ -57,7 +57,7 @@ public class MailFactory {
         ImmutableSet<MailAddress> recipients = Sets.union(
                 Sets.union(to, cc),
                 bcc).immutableCopy();
-        return new MailImpl(jmapMessage.getId().serialize(), sender, recipients, mailboxMessage.getBodyContent());
+        return new MailImpl(jmapMessage.getId().serialize(), sender, recipients, message.getContent());
     }
 
     private MailAddress emailerToMailAddress(Emailer emailer) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/f1116e2d/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProvider.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProvider.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProvider.java
index 908ef9c..e3d605d 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProvider.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProvider.java
@@ -23,8 +23,9 @@ import java.util.stream.Stream;
 
 import org.apache.james.jmap.model.mailbox.Role;
 import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.exception.MailboxException;
 
 public interface SystemMailboxesProvider {
-    Stream<Mailbox> listMailboxes(Role aRole, MailboxSession session);
+    Stream<MessageManager> listMailboxes(Role aRole, MailboxSession session) throws MailboxException;
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f1116e2d/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProviderImpl.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProviderImpl.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProviderImpl.java
index b868c85..c5d36fe 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProviderImpl.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/SystemMailboxesProviderImpl.java
@@ -19,8 +19,6 @@
 
 package org.apache.james.jmap.utils;
 
-import java.util.List;
-import java.util.function.Predicate;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
@@ -28,24 +26,22 @@ import javax.inject.Inject;
 import org.apache.james.jmap.model.mailbox.Role;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MailboxQuery;
-import org.apache.james.mailbox.store.mail.MailboxMapperFactory;
-import org.apache.james.mailbox.store.mail.model.Mailbox;
 
+import com.github.fge.lambdas.Throwing;
 import com.github.fge.lambdas.functions.ThrowingFunction;
-import com.github.fge.lambdas.supplier.ThrowingSupplier;
 import com.google.common.annotations.VisibleForTesting;
 
 public class SystemMailboxesProviderImpl implements SystemMailboxesProvider {
 
-    private final MailboxMapperFactory mailboxMapperFactory;
     private final MailboxManager mailboxManager;
 
     @Inject
-    @VisibleForTesting SystemMailboxesProviderImpl(MailboxMapperFactory mailboxMapperFactory, MailboxManager mailboxManager) {
-        this.mailboxMapperFactory = mailboxMapperFactory;
+    @VisibleForTesting SystemMailboxesProviderImpl(MailboxManager mailboxManager) {
         this.mailboxManager = mailboxManager;
     }
 
@@ -55,16 +51,12 @@ public class SystemMailboxesProviderImpl implements SystemMailboxesProvider {
                 .orElse(false);
     }
 
-    public Stream<Mailbox> listMailboxes(Role aRole, MailboxSession session) {
-        ThrowingSupplier<List<MailboxMetaData>> getAllMailboxes = () -> mailboxManager.search(MailboxQuery.builder(session).privateUserMailboxes().build(), session);
-        Predicate<MailboxPath> hasSpecifiedRole = path -> hasRole(aRole, path);
-        return getAllMailboxes.get().stream()
-                .map(MailboxMetaData::getPath)
-                .filter(hasSpecifiedRole)
-                .map(loadMailbox(session));
-    }
-
-    private ThrowingFunction<MailboxPath, Mailbox> loadMailbox(MailboxSession session) {
-        return path -> mailboxMapperFactory.getMailboxMapper(session).findMailboxByPath(path);
+    public Stream<MessageManager> listMailboxes(Role aRole, MailboxSession session) throws MailboxException {
+        ThrowingFunction<MailboxPath, MessageManager> loadMailbox = path -> mailboxManager.getMailbox(path, session);
+        return mailboxManager.search(MailboxQuery.builder(session).privateUserMailboxes().build(), session)
+            .stream()
+            .map(MailboxMetaData::getPath)
+            .filter(path -> hasRole(aRole, path))
+            .map(Throwing.function(loadMailbox).sneakyThrow());
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f1116e2d/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java
index 40649f5..79bc2f0 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java
@@ -22,30 +22,28 @@ package org.apache.james.jmap.methods;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.time.ZonedDateTime;
+import java.io.InputStream;
+import java.sql.Date;
 import java.util.Optional;
-import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Stream;
 
+import javax.mail.Flags;
+
 import org.apache.james.jmap.exceptions.AttachmentsNotFoundException;
 import org.apache.james.jmap.methods.ValueWithId.CreationMessageEntry;
-import org.apache.james.jmap.methods.ValueWithId.MessageWithId;
 import org.apache.james.jmap.model.Attachment;
 import org.apache.james.jmap.model.BlobId;
 import org.apache.james.jmap.model.CreationMessage;
 import org.apache.james.jmap.model.CreationMessage.DraftEmailer;
 import org.apache.james.jmap.model.CreationMessageId;
-import org.apache.james.jmap.model.Message;
 import org.apache.james.jmap.model.MessageContentExtractor;
 import org.apache.james.jmap.model.MessageFactory;
-import org.apache.james.jmap.model.MessageId;
 import org.apache.james.jmap.model.MessagePreviewGenerator;
 import org.apache.james.jmap.model.MessageProperties.MessageProperty;
 import org.apache.james.jmap.model.SetError;
@@ -60,6 +58,7 @@ import org.apache.james.jmap.utils.MailboxBasedHtmlTextExtractor;
 import org.apache.james.jmap.utils.SystemMailboxesProvider;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.mock.MockMailboxSession;
@@ -69,53 +68,22 @@ import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.TestId;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.store.mail.MessageMapper;
-import org.apache.james.mailbox.store.mail.model.Mailbox;
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 import org.apache.mailet.Mail;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
 
-import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 
 public class SetMessagesCreationProcessorTest {
     
-    private MessageFactory messageFactory;
-
     private static final String USER = "user@example.com";
     private static final String OUTBOX = "outbox";
     private static final TestId OUTBOX_ID = TestId.of(12345);
     private static final String DRAFTS = "drafts";
     private static final TestId DRAFTS_ID = TestId.of(12);
-    private static final String OUTBOX_MESSAGE_ID = Joiner.on('|').join(USER, OUTBOX, "12345");
     private static final String NAMESPACE = "#private";
-    private static final long UID_VALIDITY = 0l;
-    private final Mailbox outbox = new SimpleMailbox(new MailboxPath(NAMESPACE, USER, OUTBOX), UID_VALIDITY, OUTBOX_ID);
-    private final Mailbox drafts = new SimpleMailbox(new MailboxPath(NAMESPACE, USER, DRAFTS), UID_VALIDITY, DRAFTS_ID);
-
-    private static final Message FAKE_OUTBOX_MESSAGE = Message.builder()
-            .id(MessageId.of(OUTBOX_MESSAGE_ID))
-            .blobId(BlobId.of("anything"))
-            .threadId("anything")
-            .mailboxId(OUTBOX_ID.serialize())
-            .headers(ImmutableMap.of())
-            .subject("anything")
-            .size(0)
-            .date(ZonedDateTime.now())
-            .preview("anything")
-            .build();
-    
-    @Before
-    public void setup() {
-        HtmlTextExtractor htmlTextExtractor = new MailboxBasedHtmlTextExtractor(new DefaultTextExtractor());
-        MessagePreviewGenerator messagePreview = new MessagePreviewGenerator(htmlTextExtractor);
-        MessageContentExtractor messageContentExtractor = new MessageContentExtractor();
-        messageFactory = new MessageFactory(messagePreview, messageContentExtractor);
-    }
 
     private final CreationMessage.Builder creationMessageBuilder = CreationMessage.builder()
             .from(DraftEmailer.builder().name("alice").email("alice@example.com").build())
@@ -133,11 +101,7 @@ public class SetMessagesCreationProcessorTest {
                         .build())
             .build();
 
-    private final Optional<Mailbox> optionalOutbox = Optional.of(outbox);
-    private final Optional<Mailbox> optionalDrafts = Optional.of(drafts);
-
-    private MessageMapper mockMapper;
-    private MailboxSessionMapperFactory stubSessionMapperFactory;
+    private MessageFactory messageFactory;
     private MailSpool mockedMailSpool;
     private MailFactory mockedMailFactory;
     private SystemMailboxesProvider fakeSystemMailboxesProvider;
@@ -145,13 +109,18 @@ public class SetMessagesCreationProcessorTest {
     private MIMEMessageConverter mimeMessageConverter;
     private AttachmentManager mockedAttachmentManager;
     private SetMessagesCreationProcessor sut;
+    private MessageManager outbox;
+    private MessageManager drafts;
+    private Optional<MessageManager> optionalOutbox;
+    private Optional<MessageManager> optionalDrafts;
+
 
     @Before
     public void setUp() throws MailboxException {
-        mockMapper = mock(MessageMapper.class);
-        stubSessionMapperFactory = mock(MailboxSessionMapperFactory.class);
-        when(stubSessionMapperFactory.createMessageMapper(any(MailboxSession.class)))
-                .thenReturn(mockMapper);
+        HtmlTextExtractor htmlTextExtractor = new MailboxBasedHtmlTextExtractor(new DefaultTextExtractor());
+        MessagePreviewGenerator messagePreview = new MessagePreviewGenerator(htmlTextExtractor);
+        MessageContentExtractor messageContentExtractor = new MessageContentExtractor();
+        messageFactory = new MessageFactory(messagePreview, messageContentExtractor);
         mockedMailSpool = mock(MailSpool.class);
         mockedMailFactory = mock(MailFactory.class);
         mockedAttachmentManager = mock(AttachmentManager.class);
@@ -159,8 +128,16 @@ public class SetMessagesCreationProcessorTest {
         fakeSystemMailboxesProvider = new TestSystemMailboxesProvider(() -> optionalOutbox, () -> optionalDrafts);
         session = new MockMailboxSession(USER);
         mimeMessageConverter = new MIMEMessageConverter();
-        sut = new SetMessagesCreationProcessor(
-                stubSessionMapperFactory, mimeMessageConverter, mockedMailSpool, mockedMailFactory, messageFactory, fakeSystemMailboxesProvider, mockedAttachmentManager);
+        sut = new SetMessagesCreationProcessor(mimeMessageConverter, mockedMailSpool, mockedMailFactory, messageFactory, fakeSystemMailboxesProvider, mockedAttachmentManager);
+        
+        outbox = mock(MessageManager.class);
+        when(outbox.getId()).thenReturn(OUTBOX_ID);
+        when(outbox.getMailboxPath()).thenReturn(new MailboxPath(NAMESPACE, USER, OUTBOX));
+        drafts = mock(MessageManager.class);
+        when(drafts.getId()).thenReturn(DRAFTS_ID);
+        when(drafts.getMailboxPath()).thenReturn(new MailboxPath(NAMESPACE, USER, DRAFTS));
+        optionalOutbox = Optional.of(outbox);
+        optionalDrafts = Optional.of(drafts);
     }
 
     @Test
@@ -181,13 +158,7 @@ public class SetMessagesCreationProcessorTest {
         when(mockSessionMapperFactory.createMessageMapper(any(MailboxSession.class)))
                 .thenReturn(stubMapper);
 
-        sut = new SetMessagesCreationProcessor(
-                mockSessionMapperFactory, mimeMessageConverter, mockedMailSpool, mockedMailFactory, messageFactory, fakeSystemMailboxesProvider, mockedAttachmentManager) {
-            @Override
-            protected MessageWithId createMessageInOutboxAndSend(ValueWithId.CreationMessageEntry createdEntry, MailboxSession session, Mailbox outbox, Function<Long, MessageId> buildMessageIdFromUid) {
-                return new MessageWithId(createdEntry.getCreationId(), FAKE_OUTBOX_MESSAGE);
-            }
-        };
+        sut = new SetMessagesCreationProcessor(mimeMessageConverter, mockedMailSpool, mockedMailFactory, messageFactory, fakeSystemMailboxesProvider, mockedAttachmentManager);
         // When
         SetMessagesResponse result = sut.process(createMessageInOutbox, session);
 
@@ -201,8 +172,7 @@ public class SetMessagesCreationProcessorTest {
     public void processShouldReturnErrorWhenOutboxNotFound() {
         // Given
         TestSystemMailboxesProvider doNotProvideOutbox = new TestSystemMailboxesProvider(Optional::empty, () -> optionalDrafts);
-        SetMessagesCreationProcessor sut = new SetMessagesCreationProcessor(
-                stubSessionMapperFactory, mimeMessageConverter, mockedMailSpool, mockedMailFactory, messageFactory, doNotProvideOutbox, mockedAttachmentManager);
+        SetMessagesCreationProcessor sut = new SetMessagesCreationProcessor(mimeMessageConverter, mockedMailSpool, mockedMailFactory, messageFactory, doNotProvideOutbox, mockedAttachmentManager);
         // When
         SetMessagesResponse actual = sut.process(createMessageInOutbox, session);
         
@@ -212,12 +182,12 @@ public class SetMessagesCreationProcessorTest {
     }
 
     @Test
-    public void processShouldCallMessageMapperWhenRequestHasNonEmptyCreate() throws MailboxException {
+    public void processShouldCallAppendMessageWhenRequestHasNonEmptyCreate() throws MailboxException {
         // When
         sut.process(createMessageInOutbox, session);
 
         // Then
-        verify(mockMapper).add(eq(outbox), any(MailboxMessage.class));
+        verify(outbox).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), any(Boolean.class), any(Flags.class));
     }
 
     @Test
@@ -321,16 +291,16 @@ public class SetMessagesCreationProcessorTest {
     
     public static class TestSystemMailboxesProvider implements SystemMailboxesProvider {
 
-        private final Supplier<Optional<Mailbox>> outboxSupplier;
-        private final Supplier<Optional<Mailbox>> draftsSupplier;
+        private final Supplier<Optional<MessageManager>> outboxSupplier;
+        private final Supplier<Optional<MessageManager>> draftsSupplier;
 
-        private TestSystemMailboxesProvider(Supplier<Optional<Mailbox>> outboxSupplier,
-                                            Supplier<Optional<Mailbox>> draftsSupplier) {
+        private TestSystemMailboxesProvider(Supplier<Optional<MessageManager>> outboxSupplier,
+                                            Supplier<Optional<MessageManager>> draftsSupplier) {
             this.outboxSupplier = outboxSupplier;
             this.draftsSupplier = draftsSupplier;
         }
 
-        public Stream<Mailbox> listMailboxes(Role aRole, MailboxSession session) {
+        public Stream<MessageManager> listMailboxes(Role aRole, MailboxSession session) {
             if (aRole.equals(Role.OUTBOX)) {
                 return outboxSupplier.get().map(o -> Stream.of(o)).orElse(Stream.empty());
             } else if (aRole.equals(Role.DRAFTS)) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/f1116e2d/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/message/MimePartTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/message/MimePartTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/message/MimePartTest.java
deleted file mode 100644
index c935560..0000000
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/message/MimePartTest.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.jmap.model.message;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import org.apache.commons.io.IOUtils;
-import org.junit.Test;
-
-public class MimePartTest {
-
-    @Test
-    public void isHTMLShouldReturnTrueWhenHTMLSubType() {
-        MimePart mimePart = MimePart.builder()
-            .addSubType("html")
-            .build();
-        assertThat(mimePart.isHTML()).isTrue();
-    }
-
-    @Test
-    public void isHTMLShouldReturnFalseWhenOtherSubType() {
-        MimePart mimePart = MimePart.builder()
-            .addSubType("other")
-            .build();
-        assertThat(mimePart.isHTML()).isFalse();
-    }
-
-    @Test
-    public void isPlainShouldReturnTrueWhenPlainSubType() {
-        MimePart mimePart = MimePart.builder()
-            .addSubType("plain")
-            .build();
-        assertThat(mimePart.isPlain()).isTrue();
-    }
-
-    @Test
-    public void isPlainShouldReturnFalseWhenOtherSubType() {
-        MimePart mimePart = MimePart.builder()
-            .addSubType("other")
-            .build();
-        assertThat(mimePart.isPlain()).isFalse();
-    }
-
-    @Test
-    public void retrieveTextHtmlBodyShouldReturnEmptyWhenOtherSubType() {
-        MimePart mimePart = MimePart.builder()
-            .addSubType("other")
-            .build();
-        assertThat(mimePart.retrieveTextHtmlBody()).isEmpty();
-    }
-
-    @Test
-    public void retrieveTextHtmlBodyShouldReturnHtmlBodyWhenHtmlSubType() {
-        String expectedContent = "<b>content</b>";
-        MimePart htmlMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("html")
-                .addBodyContent(IOUtils.toInputStream(expectedContent))
-                .build();
-
-        assertThat(htmlMimePart.retrieveTextHtmlBody()).contains(expectedContent);
-    }
-
-    @Test
-    public void retrieveTextHtmlBodyShouldReturnHtmlBodyFromAttachmentsWhenHtmlSubTypeInAttachments() {
-        String expectedContent = "<b>content</b>";
-        MimePart htmlMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("html")
-                .addBodyContent(IOUtils.toInputStream(expectedContent))
-                .build();
-
-        MimePart mimePart = MimePart.builder()
-                .addChild(htmlMimePart)
-                .build();
-
-        assertThat(mimePart.retrieveTextHtmlBody()).contains(expectedContent);
-    }
-
-    @Test
-    public void retrieveTextHtmlBodyShouldReturnHtmlBodyWhenMultipleAttachments() {
-        String expectedContent = "<b>content</b>";
-        MimePart htmlMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("html")
-                .addBodyContent(IOUtils.toInputStream(expectedContent))
-                .build();
-        MimePart plainMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("plain")
-                .addBodyContent(IOUtils.toInputStream("content"))
-                .build();
-
-        MimePart mimePart = MimePart.builder()
-                .addChild(plainMimePart)
-                .addChild(htmlMimePart)
-                .build();
-
-        assertThat(mimePart.retrieveTextHtmlBody()).contains(expectedContent);
-    }
-
-    @Test
-    public void retrieveTextHtmlBodyShouldReturnFirstHtmlBodyWhenMultipleHtml() {
-        String expectedContent = "<b>first</b>";
-        MimePart firstMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("html")
-                .addBodyContent(IOUtils.toInputStream(expectedContent))
-                .build();
-        MimePart secondMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("html")
-                .addBodyContent(IOUtils.toInputStream("<b>second</b>"))
-                .build();
-
-        MimePart mimePart = MimePart.builder()
-                .addChild(firstMimePart)
-                .addChild(secondMimePart)
-                .build();
-
-        assertThat(mimePart.retrieveTextHtmlBody()).contains(expectedContent);
-    }
-
-    @Test
-    public void retrieveTextHtmlBodyShouldReturnEmptyWhenMultipleAttachmentsAndNoHtmlContent() {
-        MimePart htmlMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("html")
-                .build();
-        MimePart plainMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("plain")
-                .addBodyContent(IOUtils.toInputStream("content"))
-                .build();
-
-        MimePart mimePart = MimePart.builder()
-                .addChild(plainMimePart)
-                .addChild(htmlMimePart)
-                .build();
-
-        assertThat(mimePart.retrieveTextHtmlBody()).isEmpty();
-    }
-
-    @Test
-    public void retrieveTextPlainMimePartShouldReturnTextBodyWhenPlainSubType() {
-        String expectedContent = "content";
-        MimePart plainMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("plain")
-                .addBodyContent(IOUtils.toInputStream(expectedContent))
-                .build();
-        assertThat(plainMimePart.retrieveTextPlainBody()).contains(expectedContent);
-    }
-
-    @Test
-    public void retrieveTextPlainMimePartShouldReturnTextBodyFromAttachmentsWhenPlainSubTypeInAttachments() {
-        String expectedContent = "content";
-        MimePart plainMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("plain")
-                .addBodyContent(IOUtils.toInputStream(expectedContent))
-                .build();
-        MimePart mimePart = MimePart.builder()
-                .addChild(plainMimePart)
-                .build();
-        assertThat(mimePart.retrieveTextPlainBody()).contains(expectedContent);
-    }
-
-    @Test
-    public void retrieveTextPlainBodyShouldReturnTextBodyWhenMultipleAttachments() {
-        String expectedContent = "content";
-        MimePart plainMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("plain")
-                .addBodyContent(IOUtils.toInputStream(expectedContent))
-                .build();
-        MimePart htmlMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("html")
-                .addBodyContent(IOUtils.toInputStream("<b>content</b>"))
-                .build();
-
-        MimePart mimePart = MimePart.builder()
-                .addChild(htmlMimePart)
-                .addChild(plainMimePart)
-                .build();
-
-        assertThat(mimePart.retrieveTextPlainBody()).contains(expectedContent);
-    }
-
-    @Test
-    public void retrieveTextPlainBodyShouldReturnTheFirstTextBodyWhenMultipleText() {
-        String expectedContent = "first";
-        MimePart firstMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("plain")
-                .addBodyContent(IOUtils.toInputStream(expectedContent))
-                .build();
-        MimePart secondMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("plain")
-                .addBodyContent(IOUtils.toInputStream("second"))
-                .build();
-
-        MimePart mimePart = MimePart.builder()
-                .addChild(firstMimePart)
-                .addChild(secondMimePart)
-                .build();
-
-        assertThat(mimePart.retrieveTextPlainBody()).contains(expectedContent);
-    }
-
-    @Test
-    public void retrieveTextPlainBodyShouldReturnEmptyWhenMultipleAttachmentsAndNoTextContent() {
-        MimePart plainMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("plain")
-                .build();
-        MimePart htmlMimePart = MimePart.builder()
-                .addMediaType("text")
-                .addSubType("html")
-                .addBodyContent(IOUtils.toInputStream("<b>content</b>"))
-                .build();
-
-        MimePart mimePart = MimePart.builder()
-                .addChild(htmlMimePart)
-                .addChild(plainMimePart)
-                .build();
-
-        assertThat(mimePart.retrieveTextPlainBody()).isEmpty();
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/f1116e2d/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
index a527102..eb97d96 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
@@ -29,32 +29,32 @@ import javax.mail.util.SharedByteArrayInputStream;
 import org.apache.james.jmap.model.Message;
 import org.apache.james.jmap.model.MessageContentExtractor;
 import org.apache.james.jmap.model.MessageFactory;
+import org.apache.james.jmap.model.MessageFactory.MetaDataWithContent;
 import org.apache.james.jmap.model.MessageId;
 import org.apache.james.jmap.model.MessagePreviewGenerator;
 import org.apache.james.jmap.utils.HtmlTextExtractor;
 import org.apache.james.jmap.utils.MailboxBasedHtmlTextExtractor;
 import org.apache.james.mailbox.FlagsBuilder;
+import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.TestId;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
-import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
 public class MailFactoryTest {
 
     private MailFactory testee;
-    private MailboxMessage mailboxMessage;
+    private MetaDataWithContent message;
     private Message jmapMessage;
 
     @Before
-    public void init() {
+    public void init() throws MailboxException {
         testee = new MailFactory();
         String headers = "From: me@example.com\n"
                 + "To: 1@example.com\n"
@@ -63,23 +63,21 @@ public class MailFactoryTest {
                 + "Subject: news\n";
         String content = headers
                 + "Hello! How are you?";
-        PropertyBuilder propertyBuilder = new PropertyBuilder();
-        propertyBuilder.setMediaType("plain");
-        propertyBuilder.setSubType("text");
-        propertyBuilder.setTextualLineCount(18L);
-        mailboxMessage = new SimpleMailboxMessage(
-                new Date(),
-                content.length(),
-                headers.length(),
-                new SharedByteArrayInputStream(content.getBytes()),
-                new FlagsBuilder().add(Flags.Flag.SEEN).build(),
-                propertyBuilder,
-                TestId.of(2));
+        message = MetaDataWithContent.builder()
+                .uid(2)
+                .flags(new FlagsBuilder().add(Flags.Flag.SEEN).build())
+                .size(content.length())
+                .internalDate(new Date())
+                .sharedContent(new SharedByteArrayInputStream(content.getBytes(Charsets.UTF_8)))
+                .attachments(ImmutableList.of())
+                .mailboxId(TestId.of(3))
+                .messageId(MessageId.of("test|test|2"))
+                .build();
         HtmlTextExtractor htmlTextExtractor = new MailboxBasedHtmlTextExtractor(new DefaultTextExtractor());
         MessagePreviewGenerator messagePreview = new MessagePreviewGenerator(htmlTextExtractor);
         MessageContentExtractor messageContentExtractor = new MessageContentExtractor();
         MessageFactory messageFactory = new MessageFactory(messagePreview, messageContentExtractor);
-        jmapMessage = messageFactory.fromMailboxMessage(mailboxMessage, ImmutableList.of(), x -> MessageId.of("test|test|" + x));
+        jmapMessage = messageFactory.fromMetaDataWithContent(message);
     }
 
     @Test(expected=NullPointerException.class)
@@ -89,7 +87,7 @@ public class MailFactoryTest {
 
     @Test(expected=NullPointerException.class)
     public void buildMailShouldThrowWhenNullJmapMessage() throws Exception {
-        testee.build(mailboxMessage, null);
+        testee.build(message, null);
     }
 
     @Test
@@ -102,7 +100,7 @@ public class MailFactoryTest {
                 new MailAddress("2@example.com"),
                 new MailAddress("4@example.com"));
         
-        Mail actual = testee.build(mailboxMessage, jmapMessage);
+        Mail actual = testee.build(message, jmapMessage);
         
         assertThat(actual.getName()).isEqualTo(expectedName);
         assertThat(actual.getSender()).isEqualTo(expectedSender);


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org