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 bt...@apache.org on 2017/02/20 09:08:45 UTC

[01/13] james-project git commit: JAMES-1874 No need of two reads for COUNT and UNSEEN

Repository: james-project
Updated Branches:
  refs/heads/master 773210833 -> 2dd366d2a


JAMES-1874 No need of two reads for COUNT and UNSEEN


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/052a3447
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/052a3447
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/052a3447

Branch: refs/heads/master
Commit: 052a3447f170f35df181661e9b26a35a2cea0859
Parents: 7732108
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Feb 13 08:58:55 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Feb 20 16:05:33 2017 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/MessageManager.java    |  5 +-
 .../james/mailbox/model/MailboxCounters.java    | 84 ++++++++++++++++++++
 .../mailbox/model/MailboxCountersTest.java      | 33 ++++++++
 .../mailbox/caching/CachingMessageMapper.java   |  9 +++
 .../mail/CassandraMailboxCounterDAO.java        | 11 +++
 .../cassandra/mail/CassandraMessageMapper.java  | 12 +++
 .../mail/CassandraMailboxCounterDAOTest.java    | 48 +++++++++++
 .../mailbox/hbase/mail/HBaseMessageMapper.java  |  9 +++
 .../mailbox/jpa/mail/JPAMessageMapper.java      |  9 +++
 .../jpa/mail/TransactionalMessageMapper.java    |  9 +++
 .../mailbox/store/StoreMessageManager.java      |  7 +-
 .../store/mail/AbstractMessageMapper.java       |  9 +++
 .../james/mailbox/store/mail/MessageMapper.java |  2 +
 .../StoreMailboxMessageResultIteratorTest.java  |  9 +++
 .../base/MailboxEventAnalyserTest.java          | 13 +--
 .../apache/james/jmap/model/MailboxFactory.java |  7 +-
 16 files changed, 264 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
index 3f87ed4..972b33c 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
@@ -31,6 +31,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.UnsupportedCriteriaException;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.MailboxACL;
+import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
@@ -39,6 +40,8 @@ import org.apache.james.mailbox.model.MessageResult.FetchGroup;
 import org.apache.james.mailbox.model.MessageResultIterator;
 import org.apache.james.mailbox.model.SearchQuery;
 
+import com.google.common.base.Objects;
+
 /**
  * Interface which represent a Mailbox
  * 
@@ -60,7 +63,7 @@ public interface MessageManager {
     /**
      * Return the count of unseen messages in the mailbox
      */
-    long getUnseenMessageCount(MailboxSession mailboxSession) throws MailboxException;
+    MailboxCounters getMailboxCounters(MailboxSession mailboxSession) throws MailboxException;
 
     /**
      * Return if the Mailbox is writable

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxCounters.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxCounters.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxCounters.java
new file mode 100644
index 0000000..d86e14a
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxCounters.java
@@ -0,0 +1,84 @@
+/****************************************************************
+ * 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.mailbox.model;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+public class MailboxCounters {
+
+    public static class Builder {
+        private Optional<Long> count = Optional.absent();
+        private Optional<Long> unseen = Optional.absent();
+
+        public Builder count(long count) {
+            this.count = Optional.of(count);
+            return this;
+        }
+
+        public Builder unseen(long unseen) {
+            this.unseen = Optional.of(unseen);
+            return this;
+        }
+
+        public MailboxCounters build() {
+            Preconditions.checkState(count.isPresent(), "count is compulsory");
+            Preconditions.checkState(unseen.isPresent(), "unseen is compulsory");
+            return new MailboxCounters(count.get(), unseen.get());
+        }
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    private final long count;
+    private final long unseen;
+
+    private MailboxCounters(long count, long unseen) {
+        this.count = count;
+        this.unseen = unseen;
+    }
+
+    public long getCount() {
+        return count;
+    }
+
+    public long getUnseen() {
+        return unseen;
+    }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof MailboxCounters) {
+            MailboxCounters that = (MailboxCounters) o;
+
+            return Objects.equal(this.count, that.count)
+                && Objects.equal(this.unseen, that.unseen);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hashCode(count, unseen);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxCountersTest.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxCountersTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxCountersTest.java
new file mode 100644
index 0000000..e43f2ce
--- /dev/null
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxCountersTest.java
@@ -0,0 +1,33 @@
+/*
+ *   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.mailbox.model;
+
+import org.junit.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+public class MailboxCountersTest {
+
+    @Test
+    public void mailboxCountersShouldRespectBeanContract() {
+        EqualsVerifier.forClass(MailboxCounters.class).verify();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMessageMapper.java b/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMessageMapper.java
index a482a66..bc4443b 100644
--- a/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMessageMapper.java
+++ b/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMessageMapper.java
@@ -5,6 +5,7 @@ import java.util.Map;
 
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.UpdatedFlags;
@@ -68,6 +69,14 @@ public class CachingMessageMapper implements MessageMapper {
     }
 
     @Override
+    public MailboxCounters getMailboxCounters(Mailbox mailbox) throws MailboxException {
+        return MailboxCounters.builder()
+            .count(countMessagesInMailbox(mailbox))
+            .unseen(countUnseenMessagesInMailbox(mailbox))
+            .build();
+    }
+
+    @Override
     public void delete(Mailbox mailbox, MailboxMessage message)
             throws MailboxException {
         invalidateMetadata(mailbox);

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java
index 7f3c35a..2c00017 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java
@@ -35,6 +35,7 @@ import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.mailbox.cassandra.CassandraId;
 import org.apache.james.mailbox.cassandra.table.CassandraMailboxCountersTable;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 
 import com.datastax.driver.core.BoundStatement;
@@ -75,6 +76,16 @@ public class CassandraMailboxCounterDAO {
                 .where(eq(CassandraMailboxCountersTable.MAILBOX_ID, bindMarker(CassandraMailboxCountersTable.MAILBOX_ID))));
     }
 
+    public CompletableFuture<Optional<MailboxCounters>> retrieveMailboxCounters(Mailbox mailbox) throws MailboxException {
+        CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
+
+        return cassandraAsyncExecutor.executeSingleRow(bindWithMailbox(mailboxId, readStatement))
+            .thenApply(optional -> optional.map(row ->  MailboxCounters.builder()
+                .count(row.getLong(CassandraMailboxCountersTable.COUNT))
+                .unseen(row.getLong(CassandraMailboxCountersTable.UNSEEN))
+                .build()));
+    }
+
     public CompletableFuture<Optional<Long>> countMessagesInMailbox(Mailbox mailbox) throws MailboxException {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index ff0d084..c36d9a0 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -42,6 +42,7 @@ import org.apache.james.mailbox.cassandra.mail.utils.MessageDeletedDuringFlagsUp
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
+import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
@@ -65,6 +66,10 @@ import com.google.common.collect.ImmutableList;
 
 public class CassandraMessageMapper implements MessageMapper {
     private static final Logger LOGGER = LoggerFactory.getLogger(CassandraMessageMapper.class);
+    public static final MailboxCounters INITIAL_COUNTERS =  MailboxCounters.builder()
+        .count(0L)
+        .unseen(0L)
+        .build();
 
     private final ModSeqProvider modSeqProvider;
     private final MailboxSession mailboxSession;
@@ -110,6 +115,13 @@ public class CassandraMessageMapper implements MessageMapper {
     }
 
     @Override
+    public MailboxCounters getMailboxCounters(Mailbox mailbox) throws MailboxException {
+        return mailboxCounterDAO.retrieveMailboxCounters(mailbox)
+            .join()
+            .orElse(INITIAL_COUNTERS);
+    }
+
+    @Override
     public void delete(Mailbox mailbox, MailboxMessage message) {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
index 013f20c..58e0c10 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
@@ -21,9 +21,12 @@ package org.apache.james.mailbox.cassandra.mail;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.util.Optional;
+
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.mailbox.cassandra.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;
+import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 import org.junit.After;
@@ -64,6 +67,11 @@ public class CassandraMailboxCounterDAOTest {
     }
 
     @Test
+    public void retrieveMailboxCounterShouldReturnEmptyByDefault() throws Exception {
+        assertThat(testee.retrieveMailboxCounters(mailbox).join().isPresent()).isFalse();
+    }
+
+    @Test
     public void incrementCountShouldAddOneWhenAbsent() throws Exception {
         testee.incrementCount(MAILBOX_ID).join();
 
@@ -79,6 +87,46 @@ public class CassandraMailboxCounterDAOTest {
     }
 
     @Test
+    public void incrementUnseenShouldAddOneWhenAbsentOnMailboxCounters() throws Exception {
+        testee.incrementUnseen(MAILBOX_ID).join();
+
+        Optional<MailboxCounters> mailboxCounters = testee.retrieveMailboxCounters(mailbox).join();
+        assertThat(mailboxCounters.isPresent()).isTrue();
+        assertThat(mailboxCounters.get())
+            .isEqualTo(MailboxCounters.builder()
+                .count(0L)
+                .unseen(1L)
+                .build());
+    }
+
+    @Test
+    public void incrementCountShouldAddOneWhenAbsentOnMailboxCounters() throws Exception {
+        testee.incrementCount(MAILBOX_ID).join();
+
+        Optional<MailboxCounters> mailboxCounters = testee.retrieveMailboxCounters(mailbox).join();
+        assertThat(mailboxCounters.isPresent()).isTrue();
+        assertThat(mailboxCounters.get())
+            .isEqualTo(MailboxCounters.builder()
+                .count(1L)
+                .unseen(0L)
+                .build());
+    }
+
+    @Test
+    public void retrieveMailboxCounterShouldWorkWhenFullRow() throws Exception {
+        testee.incrementCount(MAILBOX_ID).join();
+        testee.incrementUnseen(MAILBOX_ID).join();
+
+        Optional<MailboxCounters> mailboxCounters = testee.retrieveMailboxCounters(mailbox).join();
+        assertThat(mailboxCounters.isPresent()).isTrue();
+        assertThat(mailboxCounters.get())
+            .isEqualTo(MailboxCounters.builder()
+                .count(1L)
+                .unseen(1L)
+                .build());
+    }
+
+    @Test
     public void decrementCountShouldRemoveOne() throws Exception {
         testee.incrementCount(MAILBOX_ID).join();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMessageMapper.java b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMessageMapper.java
index 411b15d..5d52cee 100644
--- a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMessageMapper.java
+++ b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMessageMapper.java
@@ -68,6 +68,7 @@ import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.hbase.HBaseId;
 import org.apache.james.mailbox.hbase.io.ChunkOutputStream;
+import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageId.Factory;
 import org.apache.james.mailbox.model.MessageMetaData;
@@ -112,6 +113,14 @@ public class HBaseMessageMapper extends NonTransactionalMapper implements Messag
     }
 
     @Override
+    public MailboxCounters getMailboxCounters(Mailbox mailbox) throws MailboxException {
+        return MailboxCounters.builder()
+            .count(countMessagesInMailbox(mailbox))
+            .unseen(countUnseenMessagesInMailbox(mailbox))
+            .build();
+    }
+
+    @Override
     public void endRequest() {
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
index ac581a0..532a8be 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
@@ -38,6 +38,7 @@ import org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMailboxMessage
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAEncryptedMailboxMessage;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMailboxMessage;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMailboxMessage;
+import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageRange.Type;
@@ -68,6 +69,14 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
         this.messageMetadataMapper = new MessageUtils(mailboxSession, uidProvider, modSeqProvider);
     }
 
+    @Override
+    public MailboxCounters getMailboxCounters(Mailbox mailbox) throws MailboxException {
+        return MailboxCounters.builder()
+            .count(countMessagesInMailbox(mailbox))
+            .unseen(countUnseenMessagesInMailbox(mailbox))
+            .build();
+    }
+
     /**
      * @see org.apache.james.mailbox.store.mail.MessageMapper#findInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox,
      *      org.apache.james.mailbox.model.MessageRange,

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
index 1e0715a..ce61d43 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import org.apache.commons.lang.NotImplementedException;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.UpdatedFlags;
@@ -49,6 +50,14 @@ public class TransactionalMessageMapper implements MessageMapper {
     }
 
     @Override
+    public MailboxCounters getMailboxCounters(Mailbox mailbox) throws MailboxException {
+        return MailboxCounters.builder()
+            .count(countMessagesInMailbox(mailbox))
+            .unseen(countUnseenMessagesInMailbox(mailbox))
+            .build();
+    }
+
+    @Override
     public <T> T execute(Transaction<T> transaction) throws MailboxException {
         throw new NotImplementedException();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index 60c7d19..d48ce5d 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -54,6 +54,7 @@ import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxACL.MailboxACLRights;
+import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageAttachment;
@@ -232,10 +233,10 @@ public class StoreMessageManager implements org.apache.james.mailbox.MessageMana
         return new Flags(MINIMAL_PERMANET_FLAGS);
     }
 
+
     @Override
-    public long getUnseenMessageCount(MailboxSession mailboxSession) throws MailboxException {
-        return mapperFactory.createMessageMapper(mailboxSession)
-            .countUnseenMessagesInMailbox(mailbox);
+    public MailboxCounters getMailboxCounters(MailboxSession mailboxSession) throws MailboxException {
+        return mapperFactory.createMessageMapper(mailboxSession).getMailboxCounters(mailbox);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
index de82a8d..17aa4a8 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
@@ -27,6 +27,7 @@ import javax.mail.Flags;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.UpdatedFlags;
@@ -62,6 +63,14 @@ public abstract class AbstractMessageMapper extends TransactionalMapper implemen
     public Optional<MessageUid> getLastUid(Mailbox mailbox) throws MailboxException {
         return uidProvider.lastUid(mailboxSession, mailbox);
     }
+
+    @Override
+    public MailboxCounters getMailboxCounters(Mailbox mailbox) throws MailboxException {
+        return MailboxCounters.builder()
+            .count(countMessagesInMailbox(mailbox))
+            .unseen(countUnseenMessagesInMailbox(mailbox))
+            .build();
+    }
     
     @Override
     public Iterator<UpdatedFlags> updateFlags(Mailbox mailbox, FlagsUpdateCalculator flagsUpdateCalculator, MessageRange set) throws MailboxException {

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
index f4486c5..0d1b9f3 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
@@ -24,6 +24,7 @@ import java.util.Map;
 
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.UpdatedFlags;
@@ -83,6 +84,7 @@ public interface MessageMapper extends Mapper {
     long countUnseenMessagesInMailbox(Mailbox mailbox)
             throws MailboxException;
 
+    MailboxCounters getMailboxCounters(Mailbox mailbox) throws MailboxException;
 
     /**
      * Delete the given {@link MailboxMessage}

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
index 96ba573..3fdbbe4 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
@@ -34,6 +34,7 @@ import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult;
@@ -86,6 +87,14 @@ public class StoreMailboxMessageResultIteratorTest {
         }
 
         @Override
+        public MailboxCounters getMailboxCounters(Mailbox mailbox) throws MailboxException {
+            return MailboxCounters.builder()
+                .count(countMessagesInMailbox(mailbox))
+                .unseen(countUnseenMessagesInMailbox(mailbox))
+                .build();
+        }
+
+        @Override
         public Iterator<MailboxMessage> findInMailbox(Mailbox mailbox, MessageRange set,
                                                               org.apache.james.mailbox.store.mail.MessageMapper.FetchType type, int limit)
                 throws MailboxException {

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
index e6dbed2..74a5b27 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
@@ -58,6 +58,7 @@ import org.apache.james.mailbox.model.MailboxACL.MailboxACLRight;
 import org.apache.james.mailbox.model.MailboxACL.MailboxACLRights;
 import org.apache.james.mailbox.model.MailboxAnnotation;
 import org.apache.james.mailbox.model.MailboxAnnotationKey;
+import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -174,15 +175,15 @@ public class MailboxEventAnalyserTest {
         public MessageManager getMailbox(MailboxPath mailboxPath, MailboxSession session) throws MailboxException {
             return new MessageManager() {
 
-                @Override
-                public long getUnseenMessageCount(MailboxSession mailboxSession) throws MailboxException {
-                    return 0;
-                }
-
                 public long getMessageCount(MailboxSession mailboxSession) throws MailboxException {
                     return 1;
                 }
-                
+
+                @Override
+                public MailboxCounters getMailboxCounters(MailboxSession mailboxSession) throws MailboxException {
+                    throw new UnsupportedOperationException("Not implemented");
+                }
+
                 public boolean isWriteable(MailboxSession session) {
                     return false;
                 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/052a3447/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
index 352eafc..701d2fc 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
@@ -30,7 +30,9 @@ 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.MailboxCounters;
 import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -70,13 +72,14 @@ public class MailboxFactory {
     private Optional<Mailbox> fromMessageManager(MessageManager messageManager, MailboxSession mailboxSession) throws MailboxException {
         MailboxPath mailboxPath = messageManager.getMailboxPath();
         Optional<Role> role = Role.from(mailboxPath.getName());
+        MailboxCounters mailboxCounters = messageManager.getMailboxCounters(mailboxSession);
         return Optional.ofNullable(Mailbox.builder()
                 .id(messageManager.getId())
                 .name(getName(mailboxPath, mailboxSession))
                 .parentId(getParentIdFromMailboxPath(mailboxPath, mailboxSession).orElse(null))
                 .role(role)
-                .unreadMessages(messageManager.getUnseenMessageCount(mailboxSession))
-                .totalMessages(messageManager.getMessageCount(mailboxSession))
+                .unreadMessages(mailboxCounters.getUnseen())
+                .totalMessages(mailboxCounters.getCount())
                 .sortOrder(SortOrder.getSortOrder(role))
                 .build());
     }


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


[12/13] james-project git commit: JAMES-1943 fix messageId duplication while doing multi-mailbox searches

Posted by bt...@apache.org.
JAMES-1943 fix messageId duplication while doing multi-mailbox searches

And test that fail and prove limit before unsing to set is not a good idea
Adding tests for multi-search mailbox ID duplication
Handle also combination with limit


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/39a649b2
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/39a649b2
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/39a649b2

Branch: refs/heads/master
Commit: 39a649b2e227e8d823fce41861705dad4a6c04fe
Parents: 3590659
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Feb 16 10:49:48 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Feb 20 16:07:29 2017 +0700

----------------------------------------------------------------------
 ...lasticSearchListeningMessageSearchIndex.java |   4 +-
 .../ElasticSearchIntegrationTest.java           |   2 +
 .../lucene/search/LuceneMessageSearchIndex.java |   1 +
 .../search/LuceneMessageSearchIndexTest.java    |   2 +
 .../search/SimpleMessageSearchIndexTest.java    |   2 +
 .../james/mailbox/store/search/SearchUtil.java  |  15 +++
 .../store/search/SimpleMessageSearchIndex.java  |  21 +++-
 .../search/AbstractMessageSearchIndexTest.java  | 113 ++++++++++++++++++-
 8 files changed, 151 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/39a649b2/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
index aa6983d..55d3f2e 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
@@ -97,10 +97,12 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
     public List<MessageId> search(MailboxSession session, MultimailboxesSearchQuery searchQuery, long limit)
             throws MailboxException {
         Preconditions.checkArgument(session != null, "'session' is mandatory");
-        return searcher.search(ImmutableList.of(session.getUser()), searchQuery, Optional.of(limit))
+        return searcher.search(ImmutableList.of(session.getUser()), searchQuery, Optional.empty())
             .peek(this::logIfNoMessageId)
             .map(SearchResult::getMessageId)
             .map(com.google.common.base.Optional::get)
+            .distinct()
+            .limit(limit)
             .collect(Guavate.toImmutableList());
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/39a649b2/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index 7ae3d09..2495394 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -39,6 +39,7 @@ import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
+import org.apache.james.mailbox.inmemory.InMemoryMessageIdManager;
 import org.apache.james.mailbox.store.FakeAuthenticator;
 import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
@@ -99,6 +100,7 @@ public class ElasticSearchIntegrationTest extends AbstractMessageSearchIndexTest
             new SimpleGroupMembershipResolver(),
             new MessageParser(),
             messageIdFactory);
+        messageIdManager = new InMemoryMessageIdManager(storeMailboxManager);
         storeMailboxManager.setMessageSearchIndex(messageSearchIndex);
         storeMailboxManager.init();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/39a649b2/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
index b46f9ad..2db951d 100644
--- a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
+++ b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
@@ -478,6 +478,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
                     return input.getMessageId().get();
                 }
             })
+            .filter(SearchUtil.distinct())
             .limit(Long.valueOf(limit).intValue())
             .toList();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/39a649b2/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
index d76ef4e..541d1d1 100644
--- a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
+++ b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
@@ -25,6 +25,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
+import org.apache.james.mailbox.inmemory.InMemoryMessageIdManager;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.mailbox.store.FakeAuthenticator;
 import org.apache.james.mailbox.store.FakeAuthorizator;
@@ -54,6 +55,7 @@ public class LuceneMessageSearchIndexTest extends AbstractMessageSearchIndexTest
             new SimpleGroupMembershipResolver(),
             new MessageParser(),
             messageIdFactory);
+        messageIdManager = new InMemoryMessageIdManager(storeMailboxManager);
         messageSearchIndex = new LuceneMessageSearchIndex(mapperFactory, new InMemoryId.Factory(), new RAMDirectory(), messageIdFactory, storeMailboxManager);
         storeMailboxManager.setMessageSearchIndex(messageSearchIndex);
         storeMailboxManager.init();

http://git-wip-us.apache.org/repos/asf/james-project/blob/39a649b2/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
index b23beb9..c4403a4 100644
--- a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
+++ b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
@@ -25,6 +25,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
+import org.apache.james.mailbox.inmemory.InMemoryMessageIdManager;
 import org.apache.james.mailbox.store.FakeAuthenticator;
 import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
@@ -51,6 +52,7 @@ public class SimpleMessageSearchIndexTest extends AbstractMessageSearchIndexTest
             new SimpleGroupMembershipResolver(),
             new MessageParser(),
             new InMemoryMessageId.Factory());
+        messageIdManager = new InMemoryMessageIdManager(storeMailboxManager);
         storeMailboxManager.setMessageSearchIndex(messageSearchIndex);
         storeMailboxManager.init();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/39a649b2/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java
index 2c899fa..39ec71b 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java
@@ -19,7 +19,9 @@
 package org.apache.james.mailbox.store.search;
 
 import java.nio.charset.Charset;
+import java.util.HashSet;
 import java.util.Locale;
+import java.util.Set;
 
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -33,6 +35,8 @@ import org.apache.james.mime4j.dom.address.MailboxList;
 import org.apache.james.mime4j.field.address.LenientAddressParser;
 import org.apache.james.mime4j.util.MimeUtil;
 
+import com.google.common.base.Predicate;
+
 /**
  * Utility class which helps with extracting of data for searches
  * 
@@ -472,5 +476,16 @@ public class SearchUtil {
 
     }
 
+    public static Predicate<MessageId> distinct() {
+        return new Predicate<MessageId>() {
+            private final Set<MessageId> set = new HashSet<MessageId>();
+
+            @Override
+            public boolean apply(MessageId input) {
+                return set.add(input);
+            }
+        };
+    }
+
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/39a649b2/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
index 3d3ee63..a3660f4 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
@@ -20,8 +20,10 @@ package org.apache.james.mailbox.store.search;
 
 import java.util.ArrayList;
 import java.util.EnumSet;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
@@ -31,6 +33,7 @@ import org.apache.james.mailbox.MailboxManager.SearchCapabilities;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageRange;
@@ -153,12 +156,8 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
     public List<MessageId> search(MailboxSession session, final MultimailboxesSearchQuery searchQuery, long limit) throws MailboxException {
         List<Mailbox> allUserMailboxes = mailboxMapperFactory.getMailboxMapper(session)
                 .findMailboxWithPathLike(new MailboxPath(session.getPersonalSpace(), session.getUser().getUserName(), WILDCARD));
-        FluentIterable<Mailbox> filteredMailboxes = FluentIterable.from(allUserMailboxes).filter(new Predicate<Mailbox>() {
-            @Override
-            public boolean apply(Mailbox input) {
-                return !searchQuery.getNotInMailboxes().contains(input.getMailboxId());
-            }
-        });
+        FluentIterable<Mailbox> filteredMailboxes = FluentIterable.from(allUserMailboxes)
+            .filter(notInMailboxes(searchQuery.getNotInMailboxes()));
         if (searchQuery.getInMailboxes().isEmpty()) {
             return getAsMessageIds(searchResults(session, filteredMailboxes, searchQuery.getSearchQuery()), limit);
         }
@@ -171,9 +170,19 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
         return getAsMessageIds(searchResults(session, queriedMailboxes, searchQuery.getSearchQuery()), limit);
     }
 
+    private Predicate<Mailbox> notInMailboxes(final Set<MailboxId> mailboxIds) {
+        return new Predicate<Mailbox>() {
+        @Override
+        public boolean apply(Mailbox input) {
+            return !mailboxIds.contains(input.getMailboxId());
+        }
+    };
+    }
+
     private List<MessageId> getAsMessageIds(List<SearchResult> temp, long limit) {
         return FluentIterable.from(temp)
             .transform(toMessageId())
+            .filter(SearchUtil.distinct())
             .limit(Long.valueOf(limit).intValue())
             .toList();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/39a649b2/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
index 4e1d4fc..4b1ef79 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
@@ -28,6 +28,7 @@ import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -54,6 +55,7 @@ public abstract class AbstractMessageSearchIndexTest {
 
     protected MessageSearchIndex messageSearchIndex;
     protected StoreMailboxManager storeMailboxManager;
+    protected MessageIdManager messageIdManager;
     private Mailbox mailbox;
     private Mailbox mailbox2;
     private MailboxSession session;
@@ -67,9 +69,11 @@ public abstract class AbstractMessageSearchIndexTest {
     private ComposedMessageId m7;
     private ComposedMessageId m8;
     private ComposedMessageId m9;
+    private ComposedMessageId mOther;
     private ComposedMessageId mailWithAttachment;
     private ComposedMessageId mailWithInlinedAttachment;
-    private ComposedMessageId mOther;
+    private StoreMessageManager myFolderMessageManager;
+
 
     @Before
     public void setUp() throws Exception {
@@ -82,7 +86,7 @@ public abstract class AbstractMessageSearchIndexTest {
         StoreMessageManager inboxMessageManager = (StoreMessageManager) storeMailboxManager.getMailbox(inboxPath, session);
         MailboxPath myFolderPath = new MailboxPath("#private", "benwa", "MyFolder");
         storeMailboxManager.createMailbox(myFolderPath, session);
-        StoreMessageManager myFolderMessageManager = (StoreMessageManager) storeMailboxManager.getMailbox(myFolderPath, session);
+        myFolderMessageManager = (StoreMessageManager) storeMailboxManager.getMailbox(myFolderPath, session);
         mailbox = inboxMessageManager.getMailboxEntity();
         mailbox2 = myFolderMessageManager.getMailboxEntity();
 
@@ -183,6 +187,111 @@ public abstract class AbstractMessageSearchIndexTest {
     protected abstract void await();
     protected abstract void initializeMailboxManager() throws Exception;
 
+    @Test
+    public void searchingMessageInMultipleMailboxShouldNotReturnTwiceTheSameMessage() throws MailboxException {
+        Assume.assumeTrue(messageIdManager != null);
+
+        messageIdManager.setInMailboxes(m4.getMessageId(),
+            ImmutableList.of(mailbox.getMailboxId(), mailbox2.getMailboxId()),
+            session);
+
+        await();
+
+        SearchQuery searchQuery = new SearchQuery();
+
+        assertThat(messageSearchIndex.search(session,
+            MultimailboxesSearchQuery.from(searchQuery)
+                .inMailboxes(mailbox.getMailboxId(), mailbox2.getMailboxId())
+                .build(), 20))
+            .hasSize(12)
+            .containsOnly(m1.getMessageId(),
+                m2.getMessageId(),
+                m3.getMessageId(),
+                m4.getMessageId(),
+                m5.getMessageId(),
+                m6.getMessageId(),
+                m7.getMessageId(),
+                m8.getMessageId(),
+                m9.getMessageId(),
+                mOther.getMessageId(),
+                mailWithAttachment.getMessageId(),
+                mailWithInlinedAttachment.getMessageId());
+    }
+
+    @Test
+    public void searchingMessageInMultipleMailboxShouldUnionOfTheTwoMailbox() throws MailboxException {
+        Assume.assumeTrue(messageIdManager != null);
+        messageIdManager.setInMailboxes(m4.getMessageId(),
+            ImmutableList.of(mailbox2.getMailboxId()),
+            session);
+
+        await();
+
+        SearchQuery searchQuery = new SearchQuery();
+
+        assertThat(messageSearchIndex.search(session,
+            MultimailboxesSearchQuery.from(searchQuery)
+                .inMailboxes(mailbox.getMailboxId(), mailbox2.getMailboxId())
+                .build(), 20))
+            .containsOnly(m1.getMessageId(),
+                m2.getMessageId(),
+                m3.getMessageId(),
+                m4.getMessageId(),
+                m5.getMessageId(),
+                m6.getMessageId(),
+                m7.getMessageId(),
+                m8.getMessageId(),
+                m9.getMessageId(),
+                mOther.getMessageId(),
+                mailWithAttachment.getMessageId(),
+                mailWithInlinedAttachment.getMessageId());
+    }
+
+    @Test
+    public void searchingMessageInMultipleMailboxShouldNotReturnLessMessageThanLimitArgument() throws MailboxException {
+        Assume.assumeTrue(messageIdManager != null);
+        messageIdManager.setInMailboxes(m1.getMessageId(), ImmutableList.of(mailbox.getMailboxId(), mailbox2.getMailboxId()), session);
+        messageIdManager.setInMailboxes(m2.getMessageId(), ImmutableList.of(mailbox.getMailboxId(), mailbox2.getMailboxId()), session);
+        messageIdManager.setInMailboxes(m3.getMessageId(), ImmutableList.of(mailbox.getMailboxId(), mailbox2.getMailboxId()), session);
+        messageIdManager.setInMailboxes(m4.getMessageId(), ImmutableList.of(mailbox.getMailboxId(), mailbox2.getMailboxId()), session);
+        messageIdManager.setInMailboxes(m5.getMessageId(), ImmutableList.of(mailbox.getMailboxId(), mailbox2.getMailboxId()), session);
+        messageIdManager.setInMailboxes(m6.getMessageId(), ImmutableList.of(mailbox.getMailboxId(), mailbox2.getMailboxId()), session);
+        messageIdManager.setInMailboxes(m7.getMessageId(), ImmutableList.of(mailbox.getMailboxId(), mailbox2.getMailboxId()), session);
+
+        await();
+
+        SearchQuery searchQuery = new SearchQuery();
+
+        assertThat(messageSearchIndex.search(session,
+            MultimailboxesSearchQuery.from(searchQuery)
+                .inMailboxes(mailbox2.getMailboxId(), mailbox.getMailboxId())
+                .build(), 10))
+            .hasSize(10);
+    }
+
+    @Test
+    public void searchingMessageInMultipleMailboxShouldNotReturnLessMessageThanLimitArgumentEvenIfDuplicatedMessageAreBeforeLegitimeMessage() throws MailboxException {
+        Assume.assumeTrue(messageIdManager != null);
+        messageIdManager.setInMailboxes(m1.getMessageId(), ImmutableList.of(mailbox.getMailboxId(), mailbox2.getMailboxId()), session);
+
+        SearchQuery searchQuery = new SearchQuery();
+
+        ComposedMessageId addedAfterDuplicatedMessage = myFolderMessageManager.appendMessage(
+                ClassLoader.getSystemResourceAsStream("eml/mail.eml"),
+                new Date(1406930400000L),
+                session,
+                true,
+                new Flags(Flags.Flag.SEEN));
+
+        await();
+
+        assertThat(messageSearchIndex.search(session,
+                MultimailboxesSearchQuery.from(searchQuery)
+                        .inMailboxes(mailbox2.getMailboxId(), mailbox.getMailboxId())
+                        .build(), 13))
+                .hasSize(13);
+    }
+
     @Test(expected = IllegalArgumentException.class)
     public void searchShouldThrowWhenSessionIsNull() throws MailboxException {
         SearchQuery searchQuery = new SearchQuery();


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


[10/13] james-project git commit: JAMES-1943 Adding integration tests for FilterOperator on GetMessageList

Posted by bt...@apache.org.
JAMES-1943 Adding integration tests for FilterOperator on GetMessageList


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/80489461
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/80489461
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/80489461

Branch: refs/heads/master
Commit: 80489461e52710b4f6e0e33b82f0782625bdcb05
Parents: f415df2
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Feb 16 10:45:36 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Feb 20 16:07:11 2017 +0700

----------------------------------------------------------------------
 .../integration/GetMessageListMethodTest.java   | 113 ++++++++++++++++++-
 1 file changed, 112 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/80489461/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
index 034575c..c45ff64 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
@@ -39,6 +39,7 @@ import org.apache.http.client.utils.URIBuilder;
 import org.apache.james.JmapJamesServer;
 import org.apache.james.jmap.HttpJmapAuthentication;
 import org.apache.james.jmap.api.access.AccessToken;
+import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
@@ -99,7 +100,117 @@ public abstract class GetMessageListMethodTest {
     public void teardown() {
         jmapServer.stop();
     }
-    
+
+    @Test
+    public void getMessageListANDOperatorShouldWork() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+
+        ComposedMessageId messageNotSeenNotFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        ComposedMessageId messageNotSeenFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"), new Date(), false, new Flags(Flags.Flag.FLAGGED));
+        ComposedMessageId messageSeenNotFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/oneInlinedImage.eml"), new Date(), false, new Flags(Flags.Flag.SEEN));
+        ComposedMessageId messageSeenFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/oneInlinedImage.eml"), new Date(), false, FlagsBuilder.builder().add(Flags.Flag.SEEN, Flags.Flag.FLAGGED).build());
+
+        await();
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"operator\":\"AND\",\"conditions\":[{\"isFlagged\":\"true\"},{\"isUnread\":\"true\"}]}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", contains(messageNotSeenFlagged.getMessageId().serialize()));
+    }
+
+    @Test
+    public void getMessageListOROperatorShouldWork() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+
+        ComposedMessageId messageNotSeenNotFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        ComposedMessageId messageNotSeenFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"), new Date(), false, new Flags(Flags.Flag.FLAGGED));
+        ComposedMessageId messageSeenNotFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/oneInlinedImage.eml"), new Date(), false, new Flags(Flags.Flag.SEEN));
+        ComposedMessageId messageSeenFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/oneInlinedImage.eml"), new Date(), false, FlagsBuilder.builder().add(Flags.Flag.SEEN, Flags.Flag.FLAGGED).build());
+
+        await();
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"operator\":\"OR\",\"conditions\":[{\"isFlagged\":\"true\"},{\"isUnread\":\"true\"}]}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", containsInAnyOrder(messageNotSeenFlagged.getMessageId().serialize(),
+                messageSeenFlagged.getMessageId().serialize(),
+                messageNotSeenNotFlagged.getMessageId().serialize()));
+    }
+
+    @Test
+    public void getMessageListNOTOperatorShouldWork() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+
+        ComposedMessageId messageNotSeenNotFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        ComposedMessageId messageNotSeenFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"), new Date(), false, new Flags(Flags.Flag.FLAGGED));
+        ComposedMessageId messageSeenNotFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/oneInlinedImage.eml"), new Date(), false, new Flags(Flags.Flag.SEEN));
+        ComposedMessageId messageSeenFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/oneInlinedImage.eml"), new Date(), false, FlagsBuilder.builder().add(Flags.Flag.SEEN, Flags.Flag.FLAGGED).build());
+
+        await();
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"operator\":\"NOT\",\"conditions\":[{\"isFlagged\":\"true\"},{\"isUnread\":\"true\"}]}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", containsInAnyOrder(messageSeenNotFlagged.getMessageId().serialize()));
+    }
+
+    @Test
+    public void getMessageListNestedOperatorsShouldWork() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+
+        ComposedMessageId messageNotSeenNotFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        ComposedMessageId messageNotSeenFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"), new Date(), false, new Flags(Flags.Flag.FLAGGED));
+        ComposedMessageId messageSeenNotFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/oneInlinedImage.eml"), new Date(), false, new Flags(Flags.Flag.SEEN));
+        ComposedMessageId messageSeenFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/oneInlinedImage.eml"), new Date(), false, FlagsBuilder.builder().add(Flags.Flag.SEEN, Flags.Flag.FLAGGED).build());
+
+        await();
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"operator\":\"OR\",\"conditions\":[" +
+                "{\"operator\":\"AND\", \"conditions\":[{\"isFlagged\":\"true\"},{\"isUnread\":\"true\"}]}," +
+                "{\"operator\":\"AND\", \"conditions\":[{\"isFlagged\":\"true\"},{\"isUnread\":\"false\"}]}" +
+                "]}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", containsInAnyOrder(messageSeenFlagged.getMessageId().serialize(),
+                messageNotSeenFlagged.getMessageId().serialize()));
+    }
+
     @Test
     public void getMessageListShouldReturnErrorInvalidArgumentsWhenRequestIsInvalid() throws Exception {
         given()


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


[07/13] james-project git commit: JAMES-1874 add builder to Mailbox Factory

Posted by bt...@apache.org.
JAMES-1874 add builder to Mailbox Factory


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/5acec718
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/5acec718
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/5acec718

Branch: refs/heads/master
Commit: 5acec718cbe15f9837c118406e126c9c10e5117b
Parents: f2c5821
Author: Luc DUZAN <ld...@linagora.com>
Authored: Tue Feb 14 16:05:43 2017 +0100
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Feb 20 16:06:31 2017 +0700

----------------------------------------------------------------------
 .../james/jmap/methods/GetMailboxesMethod.java  | 11 +++-
 .../methods/SetMailboxesCreationProcessor.java  |  5 +-
 .../SetMailboxesDestructionProcessor.java       |  5 +-
 .../methods/SetMailboxesUpdateProcessor.java    |  5 +-
 .../apache/james/jmap/model/MailboxFactory.java | 57 ++++++++++++++------
 .../SetMailboxesUpdateProcessorTest.java        | 18 +++++--
 .../james/jmap/model/MailboxFactoryTest.java    | 12 ++++-
 7 files changed, 87 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/5acec718/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
index 58954f3..2f4eea9 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
@@ -104,7 +104,10 @@ public class GetMailboxesMethod implements Method {
         if (mailboxIds.isPresent()) {
             return mailboxIds.get()
                 .stream()
-                .map(mailboxId -> mailboxFactory.fromMailboxId(mailboxId, mailboxSession))
+                .map(mailboxId -> mailboxFactory.builder()
+                        .id(mailboxId)
+                        .session(mailboxSession)
+                        .build())
                 .flatMap(OptionalConverter::toStream);
         } else {
             List<MailboxMetaData> userMailboxes = mailboxManager.search(
@@ -113,7 +116,11 @@ public class GetMailboxesMethod implements Method {
             return userMailboxes
                 .stream()
                 .map(MailboxMetaData::getId)
-                .map(mailboxId -> mailboxFactory.fromMailboxId(mailboxId, userMailboxes, mailboxSession))
+                .map(mailboxId -> mailboxFactory.builder()
+                        .id(mailboxId)
+                        .session(mailboxSession)
+                        .usingPreloadedMailboxesMetadata(userMailboxes)
+                        .build())
                 .flatMap(OptionalConverter::toStream);
         }
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/5acec718/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java
index 40221e9..cf7e676 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java
@@ -106,7 +106,10 @@ public class SetMailboxesCreationProcessor implements SetMailboxesProcessor {
             ensureValidMailboxName(mailboxRequest, mailboxSession);
             MailboxPath mailboxPath = getMailboxPath(mailboxRequest, creationIdsToCreatedMailboxId, mailboxSession);
             Optional<MailboxId> mailboxId = OptionalConverter.fromGuava(mailboxManager.createMailbox(mailboxPath, mailboxSession));
-            Optional<Mailbox> mailbox = mailboxId.flatMap(id -> mailboxFactory.fromMailboxId(id, mailboxSession));
+            Optional<Mailbox> mailbox = mailboxId.flatMap(id -> mailboxFactory.builder()
+                    .id(id)
+                    .session(mailboxSession)
+                    .build());
             if (mailbox.isPresent()) {
                 subscriptionManager.subscribe(mailboxSession, mailboxPath.getName());
                 builder.created(mailboxCreationId, mailbox.get());

http://git-wip-us.apache.org/repos/asf/james-project/blob/5acec718/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesDestructionProcessor.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesDestructionProcessor.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesDestructionProcessor.java
index cd6e402..75a8395 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesDestructionProcessor.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesDestructionProcessor.java
@@ -86,7 +86,10 @@ public class SetMailboxesDestructionProcessor implements SetMailboxesProcessor {
     private ImmutableMap<MailboxId, Mailbox> mapDestroyRequests(SetMailboxesRequest request, MailboxSession mailboxSession) {
         ImmutableMap.Builder<MailboxId, Mailbox> idToMailboxBuilder = ImmutableMap.builder(); 
         request.getDestroy().stream()
-            .map(id -> mailboxFactory.fromMailboxId(id, mailboxSession))
+            .map(id -> mailboxFactory.builder()
+                    .id(id)
+                    .session(mailboxSession)
+                    .build())
             .filter(Optional::isPresent)
             .map(Optional::get)
             .forEach(mailbox -> idToMailboxBuilder.put(mailbox.getId(), mailbox));

http://git-wip-us.apache.org/repos/asf/james-project/blob/5acec718/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java
index 85f06d3..6faa959 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessor.java
@@ -138,7 +138,10 @@ public class SetMailboxesUpdateProcessor implements SetMailboxesProcessor {
     }
 
     private Mailbox getMailbox(MailboxId mailboxId, MailboxSession mailboxSession) throws MailboxNotFoundException {
-        return mailboxFactory.fromMailboxId(mailboxId, mailboxSession)
+        return mailboxFactory.builder()
+                .id(mailboxId)
+                .session(mailboxSession)
+                .build()
                 .orElseThrow(() -> new MailboxNotFoundException(mailboxId.serialize()));
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/5acec718/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
index b8a42c2..bc868b0 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
@@ -23,6 +23,7 @@ import java.util.Optional;
 
 import javax.inject.Inject;
 
+import com.google.common.base.Preconditions;
 import org.apache.james.jmap.model.mailbox.Mailbox;
 import org.apache.james.jmap.model.mailbox.Role;
 import org.apache.james.jmap.model.mailbox.SortOrder;
@@ -41,27 +42,51 @@ import com.google.common.base.Splitter;
 public class MailboxFactory {
     private final MailboxManager mailboxManager;
 
+    public static class MailboxBuilder {
+        private final MailboxFactory mailboxFactory;
+        private MailboxSession session;
+        private MailboxId id;
+        private List<MailboxMetaData> userMailboxesMetadata;
+
+        private MailboxBuilder(MailboxFactory mailboxFactory) {
+            this.mailboxFactory = mailboxFactory;
+        }
+
+        public MailboxBuilder id(MailboxId id) {
+            this.id = id;
+            return this;
+        }
+
+        public MailboxBuilder session(MailboxSession session) {
+            this.session = session;
+            return this;
+        }
+
+        public MailboxBuilder usingPreloadedMailboxesMetadata(List<MailboxMetaData> userMailboxesMetadata) {
+            this.userMailboxesMetadata = userMailboxesMetadata;
+            return this;
+        }
+
+        public Optional<Mailbox> build() {
+            Preconditions.checkNotNull(id);
+            Preconditions.checkNotNull(session);
+
+            try {
+                MessageManager mailbox = mailboxFactory.mailboxManager.getMailbox(id, session);
+                return mailboxFactory.fromMessageManager(mailbox, Optional.ofNullable(userMailboxesMetadata), session);
+            } catch (MailboxException e) {
+                return Optional.empty();
+            }
+        }
+    }
+
     @Inject
     public MailboxFactory(MailboxManager mailboxManager) {
         this.mailboxManager = mailboxManager;
     }
 
-    public Optional<Mailbox> fromMailboxId(MailboxId mailboxId, MailboxSession mailboxSession) {
-        try {
-            MessageManager mailbox = mailboxManager.getMailbox(mailboxId, mailboxSession);
-            return fromMessageManager(mailbox, Optional.empty(), mailboxSession);
-        } catch (MailboxException e) {
-            return Optional.empty();
-        }
-    }
-
-    public Optional<Mailbox> fromMailboxId(MailboxId mailboxId, List<MailboxMetaData> userMailboxesMetadata, MailboxSession mailboxSession) {
-        try {
-            MessageManager mailbox = mailboxManager.getMailbox(mailboxId, mailboxSession);
-            return fromMessageManager(mailbox, Optional.of(userMailboxesMetadata), mailboxSession);
-        } catch (MailboxException e) {
-            return Optional.empty();
-        }
+    public MailboxBuilder builder() {
+        return new MailboxBuilder(this);
     }
 
     private Optional<Mailbox> fromMessageManager(MessageManager messageManager, Optional<List<MailboxMetaData>> userMailboxesMetadata,

http://git-wip-us.apache.org/repos/asf/james-project/blob/5acec718/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java
index a296303..9f9c0fc 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java
@@ -20,8 +20,9 @@
 package org.apache.james.jmap.methods;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.*;
+
+import org.mockito.Mockito;
 
 import java.util.Optional;
 
@@ -69,8 +70,17 @@ public class SetMailboxesUpdateProcessorTest {
                 .update(mailboxId, MailboxUpdateRequest.builder().parentId(newParentId).build())
                 .build();
         Mailbox mailbox = Mailbox.builder().id(mailboxId).name("name").role(Optional.empty()).build();
-        when(mockedMailboxFactory.fromMailboxId(mailboxId, mockedMailboxSession))
+
+        MailboxFactory.MailboxBuilder mockBuilder = mock(MailboxFactory.MailboxBuilder.class);
+        when(mockBuilder.id(mailboxId))
+            .thenReturn(mockBuilder);
+        when(mockBuilder.session(mockedMailboxSession))
+            .thenReturn(mockBuilder);
+        when(mockBuilder.build())
             .thenReturn(Optional.of(mailbox));
+
+        when(mockedMailboxFactory.builder())
+            .thenReturn(mockBuilder);
         when(mockedMailboxManager.getMailbox(newParentId, mockedMailboxSession))
             .thenReturn(mock(MessageManager.class));
         when(mockedMailboxUtils.hasChildren(mailboxId, mockedMailboxSession))
@@ -80,6 +90,8 @@ public class SetMailboxesUpdateProcessorTest {
         SetMailboxesResponse setMailboxesResponse = sut.process(request, mockedMailboxSession);
 
         // Then
+        verify(mockBuilder, times(1)).id(Mockito.eq(mailboxId));
+        verify(mockBuilder, times(1)).session(Mockito.eq(mockedMailboxSession));
         assertThat(setMailboxesResponse.getUpdated()).isEmpty();
         assertThat(setMailboxesResponse.getNotUpdated()).containsEntry(mailboxId, SetError.builder().type("anErrorOccurred").description("An error occurred when updating the mailbox").build());
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/5acec718/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
index 3e83baf..131c947 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
@@ -59,7 +59,11 @@ public class MailboxFactoryTest {
 
     @Test
     public void mailboxFromMailboxIdShouldReturnAbsentWhenDoesntExist() throws Exception {
-        Optional<Mailbox> mailbox = sut.fromMailboxId(InMemoryId.of(123), mailboxSession);
+        Optional<Mailbox> mailbox = sut.builder()
+                .id(InMemoryId.of(123))
+                .session(mailboxSession)
+                .build();
+
         assertThat(mailbox).isEmpty();
     }
 
@@ -69,7 +73,11 @@ public class MailboxFactoryTest {
         mailboxManager.createMailbox(mailboxPath, mailboxSession);
         MailboxId mailboxId = mailboxManager.getMailbox(mailboxPath, mailboxSession).getId();
 
-        Optional<Mailbox> mailbox = sut.fromMailboxId(mailboxId, mailboxSession);
+        Optional<Mailbox> mailbox = sut.builder()
+                .id(mailboxId)
+                .session(mailboxSession)
+                .build();
+
         assertThat(mailbox).isPresent();
         assertThat(mailbox.get().getId()).isEqualTo(mailboxId);
     }


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


[09/13] james-project git commit: JAMES-1943 Correct JMAP GetMessageList flags filter convertion

Posted by bt...@apache.org.
JAMES-1943 Correct JMAP GetMessageList flags filter convertion


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/c1ae26ed
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/c1ae26ed
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/c1ae26ed

Branch: refs/heads/master
Commit: c1ae26ede8b0a42c5ac3f4bcc694b29a7a19ea0c
Parents: 8048946
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Feb 16 10:47:39 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Feb 20 16:07:11 2017 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/model/SearchQuery.java |  4 ++
 .../james/jmap/utils/FilterToSearchQuery.java   |  8 ++--
 .../jmap/utils/FilterToSearchQueryTest.java     | 49 ++++++++++++++++++++
 3 files changed, 57 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/c1ae26ed/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
index 0c2203b..6c7e1cc 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
@@ -633,6 +633,10 @@ public class SearchQuery implements Serializable {
         return new FlagCriterion(flag, BooleanOperator.unset());
     }
 
+    public static Criterion flag(Flag flag, boolean isSet) {
+        return new FlagCriterion(flag, new BooleanOperator(isSet));
+    }
+
     /**
      * Creates a filter on the given flag.
      * 

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1ae26ed/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
index d30c692..b96d6a4 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
@@ -68,10 +68,10 @@ public class FilterToSearchQuery {
         filter.getAfter().ifPresent(after -> searchQuery.andCriteria(SearchQuery.internalDateAfter(Date.from(after.toInstant()), DateResolution.Second)));
         filter.getBefore().ifPresent(before -> searchQuery.andCriteria(SearchQuery.internalDateBefore(Date.from(before.toInstant()), DateResolution.Second)));
         filter.getHeader().ifPresent(header -> searchQuery.andCriteria(SearchQuery.headerContains(header.getName(), header.getValue().orElse(null))));
-        filter.getIsAnswered().ifPresent(isAnswered -> searchQuery.andCriteria(SearchQuery.flagIsSet(Flag.ANSWERED)));
-        filter.getIsDraft().ifPresent(isDraft -> searchQuery.andCriteria(SearchQuery.flagIsSet(Flag.DRAFT)));
-        filter.getIsFlagged().ifPresent(isFlagged -> searchQuery.andCriteria(SearchQuery.flagIsSet(Flag.FLAGGED)));
-        filter.getIsUnread().ifPresent(isUnread -> searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flag.SEEN)));
+        filter.getIsAnswered().ifPresent(isAnswered -> searchQuery.andCriteria(SearchQuery.flag(Flag.ANSWERED, isAnswered)));
+        filter.getIsDraft().ifPresent(isDraft -> searchQuery.andCriteria(SearchQuery.flag(Flag.DRAFT, isDraft)));
+        filter.getIsFlagged().ifPresent(isFlagged -> searchQuery.andCriteria(SearchQuery.flag(Flag.FLAGGED, isFlagged)));
+        filter.getIsUnread().ifPresent(isUnread -> searchQuery.andCriteria(SearchQuery.flag(Flag.SEEN, !isUnread)));
         filter.getMaxSize().ifPresent(maxSize -> searchQuery.andCriteria(SearchQuery.sizeLessThan(maxSize)));
         filter.getMinSize().ifPresent(minSize -> searchQuery.andCriteria(SearchQuery.sizeGreaterThan(minSize)));
         filter.getHasAttachment().ifPresent(hasAttachment -> searchQuery.andCriteria(SearchQuery.hasAttachment(hasAttachment)));

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1ae26ed/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
index 6b3f6bf..9b2eb17 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
@@ -251,6 +251,55 @@ public class FilterToSearchQueryTest {
         assertThat(searchQuery).isEqualTo(expectedSearchQuery);
     }
 
+
+    @Test
+    public void filterConditionShouldMapWhenIsNotAnswered() {
+        SearchQuery expectedSearchQuery = new SearchQuery();
+        expectedSearchQuery.andCriteria(SearchQuery.flagIsUnSet(Flag.ANSWERED));
+
+        SearchQuery searchQuery = new FilterToSearchQuery().convert(FilterCondition.builder()
+            .isAnswered(false)
+            .build());
+
+        assertThat(searchQuery).isEqualTo(expectedSearchQuery);
+    }
+
+    @Test
+    public void filterConditionShouldMapWhenIsNotDraft() {
+        SearchQuery expectedSearchQuery = new SearchQuery();
+        expectedSearchQuery.andCriteria(SearchQuery.flagIsUnSet(Flag.DRAFT));
+
+        SearchQuery searchQuery = new FilterToSearchQuery().convert(FilterCondition.builder()
+            .isDraft(false)
+            .build());
+
+        assertThat(searchQuery).isEqualTo(expectedSearchQuery);
+    }
+
+    @Test
+    public void filterConditionShouldMapWhenIsNotFlagged() {
+        SearchQuery expectedSearchQuery = new SearchQuery();
+        expectedSearchQuery.andCriteria(SearchQuery.flagIsUnSet(Flag.FLAGGED));
+
+        SearchQuery searchQuery = new FilterToSearchQuery().convert(FilterCondition.builder()
+            .isFlagged(false)
+            .build());
+
+        assertThat(searchQuery).isEqualTo(expectedSearchQuery);
+    }
+
+    @Test
+    public void filterConditionShouldMapWhenIsRead() {
+        SearchQuery expectedSearchQuery = new SearchQuery();
+        expectedSearchQuery.andCriteria(SearchQuery.flagIsSet(Flag.SEEN));
+
+        SearchQuery searchQuery = new FilterToSearchQuery().convert(FilterCondition.builder()
+            .isUnread(false)
+            .build());
+
+        assertThat(searchQuery).isEqualTo(expectedSearchQuery);
+    }
+
     @Test
     public void filterConditionShouldMapWhenMaxSize() {
         int maxSize = 123;


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


[08/13] james-project git commit: JAMES-1943 Avoid passing a field as parameter in messageSearches

Posted by bt...@apache.org.
JAMES-1943 Avoid passing a field as parameter in messageSearches


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f415df20
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f415df20
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f415df20

Branch: refs/heads/master
Commit: f415df20237060b58db82b7c5bebad0cc38f7b8b
Parents: 55757ba
Author: Benoit Tellier <bt...@linagora.com>
Authored: Wed Feb 15 11:17:26 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Feb 20 16:07:11 2017 +0700

----------------------------------------------------------------------
 .../org/apache/james/mailbox/store/search/MessageSearches.java   | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f415df20/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
index c478a40..6edd1af 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
@@ -101,7 +101,7 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
         while (messages.hasNext()) {
             MailboxMessage m = messages.next();
             try {
-                if (isMatch(query, m)) {
+                if (isMatch(m)) {
                     builder.add(m);
                 }
             } catch (MailboxException e) {
@@ -136,7 +136,7 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
      *         <code>false</code> otherwise
      * @throws MailboxException
      */
-    private boolean isMatch(SearchQuery query, MailboxMessage message) throws MailboxException {
+    private boolean isMatch(MailboxMessage message) throws MailboxException {
         final List<SearchQuery.Criterion> criteria = query.getCriterias();
         final Collection<MessageUid> recentMessageUids = query.getRecentMessageUids();
         boolean result = true;


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


[11/13] james-project git commit: JAMES-1943 Add JMAP integration tests for flags criterion convertions

Posted by bt...@apache.org.
JAMES-1943 Add JMAP integration tests for flags criterion convertions


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/35906597
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/35906597
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/35906597

Branch: refs/heads/master
Commit: 3590659793d1aee39debd0d4de9ce920be0e6a43
Parents: c1ae26e
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Feb 16 10:47:17 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Feb 20 16:07:12 2017 +0700

----------------------------------------------------------------------
 .../integration/GetMessageListMethodTest.java   | 174 +++++++++++++++++++
 1 file changed, 174 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/35906597/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
index c45ff64..b15a0ef 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
@@ -102,6 +102,180 @@ public abstract class GetMessageListMethodTest {
     }
 
     @Test
+    public void getMessageListSetFlaggedFilterShouldWork() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+
+        ComposedMessageId messageNotFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        ComposedMessageId messageFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"), new Date(), false, new Flags(Flags.Flag.FLAGGED));
+
+        await();
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"isFlagged\":\"true\"}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", contains(messageFlagged.getMessageId().serialize()));
+    }
+
+    @Test
+    public void getMessageListUnsetFlaggedFilterShouldWork() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+
+        ComposedMessageId messageNotFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        ComposedMessageId messageFlagged = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"), new Date(), false, new Flags(Flags.Flag.FLAGGED));
+
+        await();
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"isFlagged\":\"false\"}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", contains(messageNotFlagged.getMessageId().serialize()));
+    }
+
+    @Test
+    public void getMessageListReadFilterShouldWork() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+
+        ComposedMessageId messageNotRead = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        ComposedMessageId messageRead = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"), new Date(), false, new Flags(Flags.Flag.SEEN));
+
+        await();
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"isUnread\":\"false\"}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", contains(messageRead.getMessageId().serialize()));
+    }
+
+    @Test
+    public void getMessageListUnreadFilterShouldWork() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+
+        ComposedMessageId messageNotRead = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        ComposedMessageId messageRead = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"), new Date(), false, new Flags(Flags.Flag.SEEN));
+
+        await();
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"isUnread\":\"true\"}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", contains(messageNotRead.getMessageId().serialize()));
+    }
+
+    @Test
+    public void getMessageListSetDraftFilterShouldWork() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+
+        ComposedMessageId messageNotDraft = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        ComposedMessageId messageDraft = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"), new Date(), false, new Flags(Flags.Flag.DRAFT));
+
+        await();
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"isDraft\":\"true\"}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", contains(messageDraft.getMessageId().serialize()));
+    }
+
+    @Test
+    public void getMessageListUnsetDraftFilterShouldWork() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+
+        ComposedMessageId messageNotDraft = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        ComposedMessageId messageDraft = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"), new Date(), false, new Flags(Flags.Flag.DRAFT));
+
+        await();
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"isDraft\":\"false\"}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", contains(messageNotDraft.getMessageId().serialize()));
+    } @Test
+    public void getMessageListSetAnsweredFilterShouldWork() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+
+        ComposedMessageId messageNotAnswered = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        ComposedMessageId messageAnswered = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"), new Date(), false, new Flags(Flags.Flag.ANSWERED));
+
+        await();
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"isAnswered\":\"true\"}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", contains(messageAnswered.getMessageId().serialize()));
+    }
+
+    @Test
+    public void getMessageListUnsetAnsweredFilterShouldWork() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+
+        ComposedMessageId messageNotAnswered = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        ComposedMessageId messageAnswered = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"), new Date(), false, new Flags(Flags.Flag.ANSWERED));
+
+        await();
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"isAnswered\":\"false\"}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", contains(messageNotAnswered.getMessageId().serialize()));
+    }
+    
+    @Test
     public void getMessageListANDOperatorShouldWork() throws Exception {
         jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
 


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


[05/13] james-project git commit: JAMES-1874 Upon mailbox creation avoid retrieving mailbox by path

Posted by bt...@apache.org.
JAMES-1874 Upon mailbox creation avoid retrieving mailbox by path

Retrieving mailbox by path in Cassandra relies on an Index

Also subscripbe only if creation succeeded


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f2c58211
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f2c58211
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f2c58211

Branch: refs/heads/master
Commit: f2c58211c9f554b6ec97ba8a0a045d7b1e31829c
Parents: 45dfd90
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Feb 13 09:54:57 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Feb 20 16:06:24 2017 +0700

----------------------------------------------------------------------
 .../org/apache/james/mailbox/MailboxManager.java  |  4 ++--
 .../apache/james/util/OptionalConverterTest.java  |  1 +
 .../james/jmap/methods/GetMailboxesMethod.java    | 11 ++++++-----
 .../methods/SetMailboxesCreationProcessor.java    |  7 ++++---
 .../apache/james/jmap/model/MailboxFactory.java   | 14 --------------
 .../james/jmap/model/MailboxFactoryTest.java      | 18 ------------------
 6 files changed, 13 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f2c58211/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
index 3fcd03e..8e48df4 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
@@ -154,8 +154,8 @@ public interface MailboxManager extends RequestAware, MailboxListenerSupport {
      *            the context for this call, not null
      * @throws MailboxException
      *             when creation fails
-     * @return Empty optional when the name is empty. If mailbox is created, the id of the mailboxPath specified as
-     *  parameter is returned (and not potential mailboxIds of parent mailboxes created in the process will be omitted)
+     * @return Empty optional when the mailbox name is empty. If mailbox is created, the id of the mailboxPath specified as
+     *  parameter is returned (and potential mailboxIds of parent mailboxes created in the process will be omitted)
      */
     Optional<MailboxId> createMailbox(MailboxPath mailboxPath, MailboxSession mailboxSession) throws MailboxException;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/f2c58211/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java b/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java
index baa3aa0..5356f63 100644
--- a/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java
+++ b/server/container/util-java8/src/test/java/org/apache/james/util/OptionalConverterTest.java
@@ -21,6 +21,7 @@ package org.apache.james.util;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 import org.junit.Rule;
 import org.junit.Test;

http://git-wip-us.apache.org/repos/asf/james-project/blob/f2c58211/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
index be59d6e..58954f3 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
@@ -39,6 +39,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxQuery;
+import org.apache.james.util.OptionalConverter;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
@@ -91,8 +92,6 @@ public class GetMailboxesMethod implements Method {
         try {
             Optional<ImmutableList<MailboxId>> mailboxIds = mailboxesRequest.getIds();
             retrieveMailboxes(mailboxIds, mailboxSession)
-                .filter(Optional::isPresent)
-                .map(Optional::get)
                 .sorted(Comparator.comparing(Mailbox::getSortOrder))
                 .forEach(builder::add);
             return builder.build();
@@ -101,11 +100,12 @@ public class GetMailboxesMethod implements Method {
         }
     }
 
-    private Stream<Optional<Mailbox>> retrieveMailboxes(Optional<ImmutableList<MailboxId>> mailboxIds, MailboxSession mailboxSession) throws MailboxException {
+    private Stream<Mailbox> retrieveMailboxes(Optional<ImmutableList<MailboxId>> mailboxIds, MailboxSession mailboxSession) throws MailboxException {
         if (mailboxIds.isPresent()) {
             return mailboxIds.get()
                 .stream()
-                .map(mailboxId -> mailboxFactory.fromMailboxId(mailboxId, mailboxSession));
+                .map(mailboxId -> mailboxFactory.fromMailboxId(mailboxId, mailboxSession))
+                .flatMap(OptionalConverter::toStream);
         } else {
             List<MailboxMetaData> userMailboxes = mailboxManager.search(
                 MailboxQuery.builder(mailboxSession).privateUserMailboxes().build(),
@@ -113,7 +113,8 @@ public class GetMailboxesMethod implements Method {
             return userMailboxes
                 .stream()
                 .map(MailboxMetaData::getId)
-                .map(mailboxId -> mailboxFactory.fromMailboxId(mailboxId, userMailboxes, mailboxSession));
+                .map(mailboxId -> mailboxFactory.fromMailboxId(mailboxId, userMailboxes, mailboxSession))
+                .flatMap(OptionalConverter::toStream);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f2c58211/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java
index a4e0a28..40221e9 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesCreationProcessor.java
@@ -46,6 +46,7 @@ import org.apache.james.mailbox.exception.TooLongMailboxNameException;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxId.Factory;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.util.OptionalConverter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -104,10 +105,10 @@ public class SetMailboxesCreationProcessor implements SetMailboxesProcessor {
         try {
             ensureValidMailboxName(mailboxRequest, mailboxSession);
             MailboxPath mailboxPath = getMailboxPath(mailboxRequest, creationIdsToCreatedMailboxId, mailboxSession);
-            mailboxManager.createMailbox(mailboxPath, mailboxSession);
-            subscriptionManager.subscribe(mailboxSession, mailboxPath.getName());
-            Optional<Mailbox> mailbox = mailboxFactory.fromMailboxPath(mailboxPath, mailboxSession);
+            Optional<MailboxId> mailboxId = OptionalConverter.fromGuava(mailboxManager.createMailbox(mailboxPath, mailboxSession));
+            Optional<Mailbox> mailbox = mailboxId.flatMap(id -> mailboxFactory.fromMailboxId(id, mailboxSession));
             if (mailbox.isPresent()) {
+                subscriptionManager.subscribe(mailboxSession, mailboxPath.getName());
                 builder.created(mailboxCreationId, mailbox.get());
                 creationIdsToCreatedMailboxId.put(mailboxCreationId, mailbox.get().getId());
             } else {

http://git-wip-us.apache.org/repos/asf/james-project/blob/f2c58211/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
index cb0c10b..b8a42c2 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
@@ -34,31 +34,17 @@ import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Splitter;
 
 public class MailboxFactory {
-    private static final Logger LOGGER = LoggerFactory.getLogger(MailboxFactory.class);
-
     private final MailboxManager mailboxManager;
 
     @Inject
     public MailboxFactory(MailboxManager mailboxManager) {
         this.mailboxManager = mailboxManager;
     }
-    
-    public Optional<Mailbox> fromMailboxPath(MailboxPath mailboxPath, MailboxSession mailboxSession) {
-        try {
-            MessageManager mailbox = mailboxManager.getMailbox(mailboxPath, mailboxSession);
-            return fromMessageManager(mailbox, Optional.empty(), mailboxSession);
-        } catch (MailboxException e) {
-            LOGGER.warn("Cannot find mailbox for: " + mailboxPath.getName(), e);
-            return Optional.empty();
-        }
-    }
 
     public Optional<Mailbox> fromMailboxId(MailboxId mailboxId, MailboxSession mailboxSession) {
         try {

http://git-wip-us.apache.org/repos/asf/james-project/blob/f2c58211/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
index 7be9c73..3e83baf 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
@@ -75,24 +75,6 @@ public class MailboxFactoryTest {
     }
 
     @Test
-    public void mailboxFromMailboxPathShouldReturnNotEmptyWhenMailboxExists() throws Exception {
-        MailboxPath mailboxPath = new MailboxPath("#private", user, "mailbox");
-        mailboxManager.createMailbox(mailboxPath, mailboxSession);
-
-        Optional<Mailbox> optionalMailbox = sut.fromMailboxPath(mailboxPath, mailboxSession);
-        assertThat(optionalMailbox).isPresent();
-    }
-
-    @Test
-    public void mailboxFromMailboxPathShouldReturnEmptyWhenMailboxDoesntExist() throws Exception {
-        MailboxPath mailboxPath = new MailboxPath("#private", user, "mailbox");
-
-        Optional<Mailbox> optionalMailbox = sut.fromMailboxPath(mailboxPath, mailboxSession);
-        assertThat(optionalMailbox).isEmpty();
-    }
-
-
-    @Test
     public void getNameShouldReturnMailboxNameWhenRootMailbox() throws Exception {
         String expected = "mailbox";
         MailboxPath mailboxPath = new MailboxPath("#private", user, expected);


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


[13/13] james-project git commit: JAMES-1943 Integration tests about GetMessageList and messages in several mailboxes

Posted by bt...@apache.org.
JAMES-1943 Integration tests about GetMessageList and messages in several mailboxes


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/2dd366d2
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/2dd366d2
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/2dd366d2

Branch: refs/heads/master
Commit: 2dd366d2a20a95180651b7e20739b843da03c633
Parents: 39a649b
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Feb 16 10:49:23 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Feb 20 16:07:34 2017 +0700

----------------------------------------------------------------------
 .../integration/GetMessageListMethodTest.java   | 91 ++++++++++++++++----
 1 file changed, 75 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/2dd366d2/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
index b15a0ef..03b7bf2 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
@@ -22,11 +22,13 @@ package org.apache.james.jmap.methods.integration;
 import static com.jayway.restassured.RestAssured.given;
 import static com.jayway.restassured.config.EncoderConfig.encoderConfig;
 import static com.jayway.restassured.config.RestAssuredConfig.newConfig;
+import static org.hamcrest.Matchers.allOf;
 import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.hamcrest.Matchers.empty;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.not;
 
 import java.io.ByteArrayInputStream;
 import java.time.LocalDate;
@@ -44,6 +46,7 @@ import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -102,6 +105,31 @@ public abstract class GetMessageListMethodTest {
     }
 
     @Test
+    public void getMessageListShouldNotDuplicateMessagesInSeveralMailboxes() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox2");
+        Mailbox mailbox = jmapServer.serverProbe().getMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
+        Mailbox mailbox2 = jmapServer.serverProbe().getMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox2");
+
+        ComposedMessageId message = jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
+            new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+
+        await();
+
+        jmapServer.getJmapProbe().setInMailboxes(message.getMessageId(), username, mailbox.getMailboxId(), mailbox2.getMailboxId());
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", hasSize(1));
+    }
+    
+    @Test
     public void getMessageListSetFlaggedFilterShouldWork() throws Exception {
         jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
 
@@ -120,7 +148,9 @@ public abstract class GetMessageListMethodTest {
         .then()
             .statusCode(200)
             .body(NAME, equalTo("messageList"))
-            .body(ARGUMENTS + ".messageIds", contains(messageFlagged.getMessageId().serialize()));
+            .body(ARGUMENTS + ".messageIds", allOf(
+                    containsInAnyOrder(messageFlagged.getMessageId().serialize()), 
+                    not(containsInAnyOrder(messageNotFlagged.getMessageId().serialize()))));
     }
 
     @Test
@@ -142,7 +172,9 @@ public abstract class GetMessageListMethodTest {
         .then()
             .statusCode(200)
             .body(NAME, equalTo("messageList"))
-            .body(ARGUMENTS + ".messageIds", contains(messageNotFlagged.getMessageId().serialize()));
+            .body(ARGUMENTS + ".messageIds", allOf(
+                    containsInAnyOrder(messageNotFlagged.getMessageId().serialize()), 
+                    not(containsInAnyOrder(messageFlagged.getMessageId().serialize()))));
     }
 
     @Test
@@ -164,7 +196,9 @@ public abstract class GetMessageListMethodTest {
         .then()
             .statusCode(200)
             .body(NAME, equalTo("messageList"))
-            .body(ARGUMENTS + ".messageIds", contains(messageRead.getMessageId().serialize()));
+            .body(ARGUMENTS + ".messageIds", allOf(
+                    containsInAnyOrder(messageRead.getMessageId().serialize()), 
+                    not(containsInAnyOrder(messageNotRead.getMessageId().serialize()))));
     }
 
     @Test
@@ -186,7 +220,9 @@ public abstract class GetMessageListMethodTest {
         .then()
             .statusCode(200)
             .body(NAME, equalTo("messageList"))
-            .body(ARGUMENTS + ".messageIds", contains(messageNotRead.getMessageId().serialize()));
+            .body(ARGUMENTS + ".messageIds", allOf(
+                    containsInAnyOrder(messageNotRead.getMessageId().serialize()), 
+                    not(containsInAnyOrder(messageRead.getMessageId().serialize()))));
     }
 
     @Test
@@ -208,7 +244,9 @@ public abstract class GetMessageListMethodTest {
         .then()
             .statusCode(200)
             .body(NAME, equalTo("messageList"))
-            .body(ARGUMENTS + ".messageIds", contains(messageDraft.getMessageId().serialize()));
+            .body(ARGUMENTS + ".messageIds", allOf(
+                    containsInAnyOrder(messageDraft.getMessageId().serialize()), 
+                    not(containsInAnyOrder(messageNotDraft.getMessageId().serialize()))));
     }
 
     @Test
@@ -230,8 +268,12 @@ public abstract class GetMessageListMethodTest {
         .then()
             .statusCode(200)
             .body(NAME, equalTo("messageList"))
-            .body(ARGUMENTS + ".messageIds", contains(messageNotDraft.getMessageId().serialize()));
-    } @Test
+            .body(ARGUMENTS + ".messageIds", allOf(
+                    containsInAnyOrder(messageNotDraft.getMessageId().serialize()), 
+                    not(containsInAnyOrder(messageDraft.getMessageId().serialize()))));
+    }
+
+    @Test
     public void getMessageListSetAnsweredFilterShouldWork() throws Exception {
         jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
 
@@ -250,7 +292,9 @@ public abstract class GetMessageListMethodTest {
         .then()
             .statusCode(200)
             .body(NAME, equalTo("messageList"))
-            .body(ARGUMENTS + ".messageIds", contains(messageAnswered.getMessageId().serialize()));
+            .body(ARGUMENTS + ".messageIds", allOf(
+                    containsInAnyOrder(messageAnswered.getMessageId().serialize()), 
+                    not(containsInAnyOrder(messageNotAnswered.getMessageId().serialize()))));
     }
 
     @Test
@@ -272,7 +316,9 @@ public abstract class GetMessageListMethodTest {
         .then()
             .statusCode(200)
             .body(NAME, equalTo("messageList"))
-            .body(ARGUMENTS + ".messageIds", contains(messageNotAnswered.getMessageId().serialize()));
+            .body(ARGUMENTS + ".messageIds", allOf(
+                    containsInAnyOrder(messageNotAnswered.getMessageId().serialize()), 
+                    not(containsInAnyOrder(messageAnswered.getMessageId().serialize()))));
     }
     
     @Test
@@ -298,7 +344,11 @@ public abstract class GetMessageListMethodTest {
         .then()
             .statusCode(200)
             .body(NAME, equalTo("messageList"))
-            .body(ARGUMENTS + ".messageIds", contains(messageNotSeenFlagged.getMessageId().serialize()));
+            .body(ARGUMENTS + ".messageIds", allOf(
+                    containsInAnyOrder(messageNotSeenFlagged.getMessageId().serialize()), 
+                    not(containsInAnyOrder(messageNotSeenNotFlagged.getMessageId().serialize(),
+                            messageSeenNotFlagged.getMessageId().serialize(),
+                            messageSeenFlagged.getMessageId().serialize()))));
     }
 
     @Test
@@ -324,9 +374,11 @@ public abstract class GetMessageListMethodTest {
         .then()
             .statusCode(200)
             .body(NAME, equalTo("messageList"))
-            .body(ARGUMENTS + ".messageIds", containsInAnyOrder(messageNotSeenFlagged.getMessageId().serialize(),
-                messageSeenFlagged.getMessageId().serialize(),
-                messageNotSeenNotFlagged.getMessageId().serialize()));
+            .body(ARGUMENTS + ".messageIds", allOf(
+                    containsInAnyOrder(messageNotSeenFlagged.getMessageId().serialize(),
+                            messageSeenFlagged.getMessageId().serialize(),
+                            messageNotSeenNotFlagged.getMessageId().serialize()), 
+                    not(containsInAnyOrder(messageSeenNotFlagged.getMessageId().serialize()))));
     }
 
     @Test
@@ -352,7 +404,11 @@ public abstract class GetMessageListMethodTest {
         .then()
             .statusCode(200)
             .body(NAME, equalTo("messageList"))
-            .body(ARGUMENTS + ".messageIds", containsInAnyOrder(messageSeenNotFlagged.getMessageId().serialize()));
+            .body(ARGUMENTS + ".messageIds", allOf(
+                    containsInAnyOrder(messageSeenNotFlagged.getMessageId().serialize()), 
+                    not(containsInAnyOrder(messageNotSeenFlagged.getMessageId().serialize(),
+                            messageSeenFlagged.getMessageId().serialize(),
+                            messageNotSeenNotFlagged.getMessageId().serialize()))));
     }
 
     @Test
@@ -381,8 +437,11 @@ public abstract class GetMessageListMethodTest {
         .then()
             .statusCode(200)
             .body(NAME, equalTo("messageList"))
-            .body(ARGUMENTS + ".messageIds", containsInAnyOrder(messageSeenFlagged.getMessageId().serialize(),
-                messageNotSeenFlagged.getMessageId().serialize()));
+            .body(ARGUMENTS + ".messageIds", allOf(
+                    containsInAnyOrder(messageSeenFlagged.getMessageId().serialize(),
+                            messageNotSeenFlagged.getMessageId().serialize()), 
+                    not(containsInAnyOrder(messageNotSeenNotFlagged.getMessageId().serialize(),
+                            messageSeenNotFlagged.getMessageId().serialize()))));
     }
 
     @Test


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


[06/13] james-project git commit: JAMES-1925 Improve CassandraMailboxMapper::save reading

Posted by bt...@apache.org.
JAMES-1925 Improve CassandraMailboxMapper::save reading


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/55757ba8
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/55757ba8
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/55757ba8

Branch: refs/heads/master
Commit: 55757ba8a0f2d738d78e04ca077928d6a620db82
Parents: 5acec71
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Feb 16 09:13:55 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Feb 20 16:06:31 2017 +0700

----------------------------------------------------------------------
 .../cassandra/mail/CassandraMailboxMapper.java  | 58 ++++++++++----------
 .../SetMailboxesUpdateProcessorTest.java        |  5 +-
 2 files changed, 33 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/55757ba8/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
index 6850dcb..f863523 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
@@ -129,42 +129,42 @@ public class CassandraMailboxMapper implements MailboxMapper {
         CassandraId cassandraId = retrieveId(cassandraMailbox);
         cassandraMailbox.setMailboxId(cassandraId);
         try {
-            boolean applied = mailboxPathDAO.save(mailbox.generateAssociatedPath(), cassandraId)
-                    .thenCompose(result -> {
-                                if (result) {
-                                    return mailboxDAO.retrieveMailbox(cassandraId)
-                                            .thenCompose(optional -> {
-                                                CompletableFuture<Void> delete = optional
-                                                        .map(storedMailbox -> mailboxPathDAO
-                                                                .delete(storedMailbox.generateAssociatedPath())
-                                                        )
-                                                        .orElse(CompletableFuture.completedFuture(null));
-
-                                                CompletableFuture<Void> save = mailboxDAO.save(cassandraMailbox);
-
-                                                return CompletableFuture.allOf(delete, save).thenApply(any -> result);
-                                            });
-                                }
-
-                                return CompletableFuture.completedFuture(result);
-                            }
-                    ).join();
-
+            boolean applied = trySave(cassandraMailbox, cassandraId).join();
             if (!applied) {
                 throw new MailboxExistsException(mailbox.generateAssociatedPath().asString());
             }
         } catch (CompletionException e) {
-            if (e.getCause() instanceof InvalidQueryException) {
-                String errorMessage = e.getCause().getMessage();
-                if (StringUtils.containsIgnoreCase(errorMessage, VALUES_MAY_NOT_BE_LARGER_THAN_64_K) ||
-                        StringUtils.containsIgnoreCase(errorMessage, CLUSTERING_COLUMNS_IS_TOO_LONG)) {
-                    throw new TooLongMailboxNameException("too long mailbox name");
+            manageException(e);
+        }
+        return cassandraId;
+    }
+
+    private CompletableFuture<Boolean> trySave(SimpleMailbox cassandraMailbox, CassandraId cassandraId) {
+        return mailboxPathDAO.save(cassandraMailbox.generateAssociatedPath(), cassandraId)
+            .thenCompose(result -> {
+                if (result) {
+                    return mailboxDAO.retrieveMailbox(cassandraId)
+                        .thenCompose(optional -> CompletableFuture
+                            .allOf(optional
+                                    .map(storedMailbox -> mailboxPathDAO.delete(storedMailbox.generateAssociatedPath()))
+                                    .orElse(CompletableFuture.completedFuture(null)),
+                                mailboxDAO.save(cassandraMailbox))
+                            .thenApply(any -> result));
                 }
-                throw new MailboxException("It has error with cassandra storage", e.getCause());
+                return CompletableFuture.completedFuture(result);
+            });
+    }
+
+    private void manageException(CompletionException e) throws MailboxException {
+        if (e.getCause() instanceof InvalidQueryException) {
+            String errorMessage = e.getCause().getMessage();
+            if (StringUtils.containsIgnoreCase(errorMessage, VALUES_MAY_NOT_BE_LARGER_THAN_64_K) ||
+                    StringUtils.containsIgnoreCase(errorMessage, CLUSTERING_COLUMNS_IS_TOO_LONG)) {
+                throw new TooLongMailboxNameException("too long mailbox name");
             }
-            throw e;
+            throw new MailboxException("It has error with cassandra storage", e.getCause());
         }
-        return cassandraId;
+        throw e;
     }
 
     private CassandraId retrieveId(SimpleMailbox cassandraMailbox) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/55757ba8/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java
index 9f9c0fc..409ba09 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMailboxesUpdateProcessorTest.java
@@ -20,7 +20,10 @@
 package org.apache.james.jmap.methods;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import org.mockito.Mockito;
 


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


[02/13] james-project git commit: JAMES-1874 MailboxId should be returned upon mailbox creation

Posted by bt...@apache.org.
JAMES-1874 MailboxId should be returned upon mailbox creation


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/45dfd908
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/45dfd908
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/45dfd908

Branch: refs/heads/master
Commit: 45dfd9084172ccb1cfcc9e9fc52e2c59e1ff71f0
Parents: 1fa1cd8
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Feb 13 09:46:07 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Feb 20 16:05:39 2017 +0700

----------------------------------------------------------------------
 .../org/apache/james/mailbox/MailboxManager.java   |  6 +++++-
 .../apache/james/mailbox/MailboxManagerTest.java   | 17 ++++++++++++++++-
 .../mailbox/caching/CachingMailboxMapper.java      |  4 ++--
 .../cassandra/mail/CassandraMailboxMapper.java     |  3 ++-
 .../mailbox/hbase/mail/HBaseMailboxMapper.java     |  3 ++-
 .../james/mailbox/jcr/mail/JCRMailboxMapper.java   |  3 ++-
 .../james/mailbox/jpa/mail/JPAMailboxMapper.java   |  3 ++-
 .../jpa/mail/TransactionalMailboxMapper.java       | 10 +++++-----
 .../mailbox/maildir/mail/MaildirMailboxMapper.java |  5 +++--
 .../inmemory/mail/InMemoryMailboxMapper.java       |  3 ++-
 .../james/mailbox/store/StoreMailboxManager.java   |  9 +++++++--
 .../james/mailbox/store/mail/MailboxMapper.java    |  2 +-
 .../store/TestMailboxSessionMapperFactory.java     |  2 +-
 .../processor/base/MailboxEventAnalyserTest.java   |  3 ++-
 ...faultMailboxesProvisioningFilterThreadTest.java |  6 +++++-
 15 files changed, 57 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
index 0cf3e1a..3fcd03e 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
@@ -42,6 +42,8 @@ import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
 import org.apache.james.mailbox.model.SimpleMailboxACL;
 import org.slf4j.Logger;
 
+import com.google.common.base.Optional;
+
 /**
  * <p>
  * Central MailboxManager which creates, lists, provides, renames and deletes
@@ -152,8 +154,10 @@ public interface MailboxManager extends RequestAware, MailboxListenerSupport {
      *            the context for this call, not null
      * @throws MailboxException
      *             when creation fails
+     * @return Empty optional when the name is empty. If mailbox is created, the id of the mailboxPath specified as
+     *  parameter is returned (and not potential mailboxIds of parent mailboxes created in the process will be omitted)
      */
-    void createMailbox(MailboxPath mailboxPath, MailboxSession mailboxSession) throws MailboxException;
+    Optional<MailboxId> createMailbox(MailboxPath mailboxPath, MailboxSession mailboxSession) throws MailboxException;
 
     /**
      * Delete the mailbox with the name

http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index 9986712..8024f26 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -35,6 +35,7 @@ import org.apache.james.mailbox.mock.MockMailboxManager;
 import org.apache.james.mailbox.model.MailboxAnnotation;
 import org.apache.james.mailbox.model.MailboxAnnotationKey;
 import org.apache.james.mailbox.model.MailboxConstants;
+import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MailboxQuery;
@@ -47,6 +48,7 @@ import org.xenei.junit.contract.Contract;
 import org.xenei.junit.contract.ContractTest;
 import org.xenei.junit.contract.IProducer;
 
+import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
@@ -114,7 +116,20 @@ public class MailboxManagerTest<T extends MailboxManager> {
         MailboxPath inbox = MailboxPath.inbox(session);
         assertThat(mailboxManager.mailboxExists(inbox, session)).isFalse();
     }
-    
+
+    @ContractTest
+    public void createMailboxShouldReturnRightId() throws MailboxException, UnsupportedEncodingException {
+        session = mailboxManager.createSystemSession(USER_1, LoggerFactory.getLogger("Mock"));
+        mailboxManager.startProcessingRequest(session);
+
+        MailboxPath mailboxPath = new MailboxPath(MailboxConstants.USER_NAMESPACE, USER_1, "name.subfolder");
+        Optional<MailboxId> mailboxId = mailboxManager.createMailbox(mailboxPath, session);
+        MessageManager retrievedMailbox = mailboxManager.getMailbox(mailboxPath, session);
+
+        assertThat(mailboxId.isPresent()).isTrue();
+        assertThat(mailboxId.get()).isEqualTo(retrievedMailbox.getId());
+    }
+
     @ContractTest
     public void user1ShouldBeAbleToCreateInbox() throws MailboxException, UnsupportedEncodingException {
         session = mailboxManager.createSystemSession(USER_1, LoggerFactory.getLogger("Mock"));

http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMailboxMapper.java b/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMailboxMapper.java
index c311b1d..2c326c4 100644
--- a/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMailboxMapper.java
+++ b/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMailboxMapper.java
@@ -55,9 +55,9 @@ public class CachingMailboxMapper implements MailboxMapper {
 	}
 
 	@Override
-	public void save(Mailbox mailbox) throws MailboxException {
+	public MailboxId save(Mailbox mailbox) throws MailboxException {
 		invalidate(mailbox);
-		underlying.save(mailbox);
+		return underlying.save(mailbox);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
index 6662aef..6850dcb 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
@@ -122,7 +122,7 @@ public class CassandraMailboxMapper implements MailboxMapper {
     }
 
     @Override
-    public void save(Mailbox mailbox) throws MailboxException {
+    public MailboxId save(Mailbox mailbox) throws MailboxException {
         Preconditions.checkArgument(mailbox instanceof SimpleMailbox);
         SimpleMailbox cassandraMailbox = (SimpleMailbox) mailbox;
 
@@ -164,6 +164,7 @@ public class CassandraMailboxMapper implements MailboxMapper {
             }
             throw e;
         }
+        return cassandraId;
     }
 
     private CassandraId retrieveId(SimpleMailbox cassandraMailbox) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapper.java b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapper.java
index 8c89e9d..874175d 100644
--- a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapper.java
+++ b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapper.java
@@ -252,7 +252,7 @@ public class HBaseMailboxMapper extends HBaseNonTransactionalMapper implements M
     }
     
     @Override
-    public void save(Mailbox mlbx) throws MailboxException {
+    public MailboxId save(Mailbox mlbx) throws MailboxException {
         //TODO: maybe switch to checkAndPut for transactions
         HTable mailboxes = null;
         try {
@@ -262,6 +262,7 @@ public class HBaseMailboxMapper extends HBaseNonTransactionalMapper implements M
              */
             Put put = toPut((HBaseMailbox) mlbx);
             mailboxes.put(put);
+            return mlbx.getMailboxId();
         } catch (IOException ex) {
             throw new MailboxException("IOExeption", ex);
         } finally {

http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java b/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java
index c546a8c..761a2ac 100644
--- a/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java
+++ b/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java
@@ -159,7 +159,7 @@ public class JCRMailboxMapper extends AbstractJCRScalingMapper implements Mailbo
      * org.apache.james.mailbox.store.mail.MailboxMapper#save(org.apache.james.
      * imap.store.mail.model.Mailbox)
      */
-    public void save(Mailbox mailbox) throws MailboxException {
+    public MailboxId save(Mailbox mailbox) throws MailboxException {
         
         try {
             final JCRMailbox jcrMailbox = (JCRMailbox)mailbox;
@@ -191,6 +191,7 @@ public class JCRMailboxMapper extends AbstractJCRScalingMapper implements Mailbo
            } else {
                jcrMailbox.merge(node);
            }
+           return jcrMailbox.getMailboxId();
             
         } catch (RepositoryException e) {
             throw new MailboxException("Unable to save mailbox " + mailbox, e);

http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
index 7fe207a..0183789 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
@@ -74,7 +74,7 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM
     /**
      * @see org.apache.james.mailbox.store.mail.MailboxMapper#save(Mailbox)
      */
-    public void save(Mailbox mailbox) throws MailboxException {
+    public MailboxId save(Mailbox mailbox) throws MailboxException {
         try {
             this.lastMailboxName = mailbox.getName();
             JPAMailbox persistedMailbox = JPAMailbox.from(mailbox);
@@ -82,6 +82,7 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM
             if (!(mailbox instanceof JPAMailbox)) {
                 mailbox.setMailboxId(persistedMailbox.getMailboxId());
             }
+            return mailbox.getMailboxId();
         } catch (PersistenceException e) {
             throw new MailboxException("Save of mailbox " + mailbox.getName() +" failed", e);
         } 

http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
index 2d2e366..c01a4f2 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
@@ -50,16 +50,16 @@ public class TransactionalMailboxMapper implements MailboxMapper {
     }
 
     @Override
-    public void save(final Mailbox mailbox) throws MailboxException {
+    public MailboxId save(final Mailbox mailbox) throws MailboxException {
         try {
-            wrapped.execute(new VoidTransaction() {
+            return wrapped.execute(new Transaction<MailboxId>() {
                 @Override
-                public void runVoid() throws MailboxException {
-                    wrapped.save(mailbox);
+                public MailboxId run() throws MailboxException {
+                    return wrapped.save(mailbox);
                 }
             });
         } catch (MailboxException e) {
-            Throwables.propagate(e);
+            throw Throwables.propagate(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
index 73c02d3..a59ab1f 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
@@ -160,7 +160,7 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
      * @see org.apache.james.mailbox.store.mail.MailboxMapper#save(org.apache.james.mailbox.store.mail.model.Mailbox)
      */
     @Override
-    public void save(Mailbox mailbox) throws MailboxException {
+    public MailboxId save(Mailbox mailbox) throws MailboxException {
         try {
             Mailbox originalMailbox = getCachedMailbox((MaildirId) mailbox.getMailboxId());
             MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
@@ -229,7 +229,8 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
             }
             folder.setACL(session, mailbox.getACL());
         }
-        
+        cacheMailbox(mailbox);
+        return mailbox.getMailboxId();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
index 3862b68..7372975 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
@@ -109,13 +109,14 @@ public class InMemoryMailboxMapper implements MailboxMapper {
     /**
      * @see org.apache.james.mailbox.store.mail.MailboxMapper#save(org.apache.james.mailbox.store.mail.model.Mailbox)
      */
-    public void save(Mailbox mailbox) throws MailboxException {
+    public MailboxId save(Mailbox mailbox) throws MailboxException {
         InMemoryId id = (InMemoryId) mailbox.getMailboxId();
         if (id == null) {
             id = InMemoryId.of(mailboxIdGenerator.incrementAndGet());
             ((SimpleMailbox) mailbox).setMailboxId(id);
         }
         mailboxesById.put(id, mailbox);
+        return mailbox.getMailboxId();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index e426ebb..87c3cfa 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -84,8 +84,10 @@ import org.apache.james.mailbox.store.transaction.Mapper;
 import org.apache.james.mailbox.store.transaction.TransactionalMapper;
 import org.slf4j.Logger;
 
+import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
 import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Iterables;
 
 /**
  * This base class of an {@link MailboxManager} implementation provides a high-level api for writing your own
@@ -523,7 +525,7 @@ public class StoreMailboxManager implements MailboxManager {
     }
 
     @Override
-    public void createMailbox(MailboxPath mailboxPath, final MailboxSession mailboxSession)
+    public Optional<MailboxId> createMailbox(MailboxPath mailboxPath, final MailboxSession mailboxSession)
             throws MailboxException {
         mailboxSession.getLog().debug("createMailbox " + mailboxPath);
         final int length = mailboxPath.getName().length();
@@ -537,6 +539,7 @@ public class StoreMailboxManager implements MailboxManager {
             // Create parents first
             // If any creation fails then the mailbox will not be created
             // TODO: transaction
+            final List<MailboxId> mailboxIds = new ArrayList<MailboxId>();
             for (final MailboxPath mailbox : mailboxPath.getHierarchyLevels(getDelimiter()))
 
                 locker.executeWithLock(mailboxSession, mailbox, new LockAwareExecution<Void>() {
@@ -548,7 +551,7 @@ public class StoreMailboxManager implements MailboxManager {
                             mapper.execute(new TransactionalMapper.VoidTransaction() {
 
                                 public void runVoid() throws MailboxException {
-                                    mapper.save(m);
+                                    mailboxIds.add(mapper.save(m));
                                 }
 
                             });
@@ -561,7 +564,9 @@ public class StoreMailboxManager implements MailboxManager {
                     }
                 }, true);
 
+            return Optional.fromNullable(Iterables.getLast(mailboxIds));
         }
+        return Optional.absent();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
index f46a2f8..f737328 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
@@ -41,7 +41,7 @@ public interface MailboxMapper extends Mapper {
      * @param mailbox
      * @throws MailboxException
      */
-    void save(Mailbox mailbox) throws MailboxException;
+    MailboxId save(Mailbox mailbox) throws MailboxException;
     
     /**
      * Delete the given {@link Mailbox} from the underlying storage

http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/mailbox/store/src/test/java/org/apache/james/mailbox/store/TestMailboxSessionMapperFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/TestMailboxSessionMapperFactory.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/TestMailboxSessionMapperFactory.java
index 98e51f4..d7e70bd 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/TestMailboxSessionMapperFactory.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/TestMailboxSessionMapperFactory.java
@@ -86,7 +86,7 @@ public class TestMailboxSessionMapperFactory extends MailboxSessionMapperFactory
 
         mailboxMapper = new MailboxMapper() {
             @Override
-            public void save(Mailbox mailbox) throws MailboxException {
+            public MailboxId save(Mailbox mailbox) throws MailboxException {
                 throw new NotImplementedException();
             }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
index 74a5b27..5c53a8f 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
@@ -78,6 +78,7 @@ import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.junit.Test;
 import org.slf4j.Logger;
 
+import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 
 public class MailboxEventAnalyserTest {
@@ -340,7 +341,7 @@ public class MailboxEventAnalyserTest {
             throw new UnsupportedOperationException("Not implemented");
         }
         
-        public void createMailbox(MailboxPath mailboxPath, MailboxSession mailboxSession) throws MailboxException {
+        public Optional<MailboxId> createMailbox(MailboxPath mailboxPath, MailboxSession mailboxSession) throws MailboxException {
             throw new UnsupportedOperationException("Not implemented");
         }
         

http://git-wip-us.apache.org/repos/asf/james-project/blob/45dfd908/server/protocols/jmap/src/test/java/org/apache/james/jmap/DefaultMailboxesProvisioningFilterThreadTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/DefaultMailboxesProvisioningFilterThreadTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/DefaultMailboxesProvisioningFilterThreadTest.java
index abcd91c..c486baa 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/DefaultMailboxesProvisioningFilterThreadTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/DefaultMailboxesProvisioningFilterThreadTest.java
@@ -22,6 +22,7 @@ import java.util.EnumSet;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.commons.lang.NotImplementedException;
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -42,9 +43,11 @@ import org.apache.james.mailbox.model.MailboxQuery;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
+import org.apache.james.mailbox.model.TestId;
 import org.junit.Test;
 import org.slf4j.Logger;
 
+import com.google.common.base.Optional;
 import com.google.testing.threadtester.AnnotatedTestRunner;
 import com.google.testing.threadtester.ThreadedAfter;
 import com.google.testing.threadtester.ThreadedBefore;
@@ -137,7 +140,8 @@ public class DefaultMailboxesProvisioningFilterThreadTest {
         }
 
         @Override
-        public void createMailbox(MailboxPath mailboxPath, MailboxSession mailboxSession) throws MailboxException {
+        public Optional<MailboxId> createMailbox(MailboxPath mailboxPath, MailboxSession mailboxSession) throws MailboxException {
+            return Optional.of(TestId.of(18L));
         }
 
         @Override


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


[04/13] james-project git commit: JAMES-1874 Adding tests for MailboxPath::getLevels

Posted by bt...@apache.org.
JAMES-1874 Adding tests for MailboxPath::getLevels


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/1fa1cd82
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/1fa1cd82
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/1fa1cd82

Branch: refs/heads/master
Commit: 1fa1cd824036e20c603741e2ddb1e299bed25abf
Parents: bdc76d1
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Feb 13 09:29:26 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Feb 20 16:05:39 2017 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/model/MailboxPath.java |  5 ++
 .../james/mailbox/model/MailboxPathTest.java    | 62 ++++++++++++++++++++
 2 files changed, 67 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/1fa1cd82/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
index e4f132b..06a87b2 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
@@ -24,6 +24,8 @@ import java.util.List;
 
 import org.apache.james.mailbox.MailboxSession;
 
+import com.google.common.collect.ImmutableList;
+
 /**
  * The path to a mailbox.
  */
@@ -116,6 +118,9 @@ public class MailboxPath {
      * @return list of hierarchy levels
      */
     public List<MailboxPath> getHierarchyLevels(char delimiter) {
+        if (name == null) {
+            return ImmutableList.of(this);
+        }
         ArrayList<MailboxPath> levels = new ArrayList<MailboxPath>();
         int index = name.indexOf(delimiter);
         while (index >= 0) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/1fa1cd82/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxPathTest.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxPathTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxPathTest.java
new file mode 100644
index 0000000..b474aac
--- /dev/null
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxPathTest.java
@@ -0,0 +1,62 @@
+/*
+ *   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.mailbox.model;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+
+public class MailboxPathTest {
+
+    @Test
+    public void getHierarchyLevelsShouldBeOrdered() {
+        assertThat(new MailboxPath("#private", "user", "inbox.folder.subfolder")
+            .getHierarchyLevels('.'))
+            .containsExactly(
+                new MailboxPath("#private", "user", "inbox"),
+                new MailboxPath("#private", "user", "inbox.folder"),
+                new MailboxPath("#private", "user", "inbox.folder.subfolder"));
+    }
+
+    @Test
+    public void getHierarchyLevelsShouldReturnPathWhenOneLevel() {
+        assertThat(new MailboxPath("#private", "user", "inbox")
+            .getHierarchyLevels('.'))
+            .containsExactly(
+                new MailboxPath("#private", "user", "inbox"));
+    }
+
+    @Test
+    public void getHierarchyLevelsShouldReturnPathWhenEmptyName() {
+        assertThat(new MailboxPath("#private", "user", "")
+            .getHierarchyLevels('.'))
+            .containsExactly(
+                new MailboxPath("#private", "user", ""));
+    }
+
+    @Test
+    public void getHierarchyLevelsShouldReturnPathWhenNullName() {
+        assertThat(new MailboxPath("#private", "user", null)
+            .getHierarchyLevels('.'))
+            .containsExactly(
+                new MailboxPath("#private", "user", null));
+    }
+}


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


[03/13] james-project git commit: JAMES-1874 Avoid reading parent mailboxId when we already have it in memory

Posted by bt...@apache.org.
JAMES-1874 Avoid reading parent mailboxId when we already have it in memory


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/bdc76d13
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/bdc76d13
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/bdc76d13

Branch: refs/heads/master
Commit: bdc76d13e2d6f4a02d8c27b6c2e738fbc25740d3
Parents: 052a344
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Feb 13 09:09:35 2017 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Mon Feb 20 16:05:39 2017 +0700

----------------------------------------------------------------------
 .../james/jmap/methods/GetMailboxesMethod.java  | 11 +++---
 .../apache/james/jmap/model/MailboxFactory.java | 38 +++++++++++++++-----
 .../james/jmap/model/MailboxFactoryTest.java    | 27 ++++++++++++--
 3 files changed, 59 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/bdc76d13/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
index d926d21..be59d6e 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
@@ -90,8 +90,7 @@ public class GetMailboxesMethod implements Method {
         GetMailboxesResponse.Builder builder = GetMailboxesResponse.builder();
         try {
             Optional<ImmutableList<MailboxId>> mailboxIds = mailboxesRequest.getIds();
-            retrieveMailboxIds(mailboxIds, mailboxSession)
-                .map(mailboxId -> mailboxFactory.fromMailboxId(mailboxId, mailboxSession))
+            retrieveMailboxes(mailboxIds, mailboxSession)
                 .filter(Optional::isPresent)
                 .map(Optional::get)
                 .sorted(Comparator.comparing(Mailbox::getSortOrder))
@@ -102,17 +101,19 @@ public class GetMailboxesMethod implements Method {
         }
     }
 
-    private Stream<MailboxId> retrieveMailboxIds(Optional<ImmutableList<MailboxId>> mailboxIds, MailboxSession mailboxSession) throws MailboxException {
+    private Stream<Optional<Mailbox>> retrieveMailboxes(Optional<ImmutableList<MailboxId>> mailboxIds, MailboxSession mailboxSession) throws MailboxException {
         if (mailboxIds.isPresent()) {
             return mailboxIds.get()
-                .stream();
+                .stream()
+                .map(mailboxId -> mailboxFactory.fromMailboxId(mailboxId, mailboxSession));
         } else {
             List<MailboxMetaData> userMailboxes = mailboxManager.search(
                 MailboxQuery.builder(mailboxSession).privateUserMailboxes().build(),
                 mailboxSession);
             return userMailboxes
                 .stream()
-                .map(MailboxMetaData::getId);
+                .map(MailboxMetaData::getId)
+                .map(mailboxId -> mailboxFactory.fromMailboxId(mailboxId, userMailboxes, mailboxSession));
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/bdc76d13/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
index 701d2fc..cb0c10b 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
@@ -53,7 +53,7 @@ public class MailboxFactory {
     public Optional<Mailbox> fromMailboxPath(MailboxPath mailboxPath, MailboxSession mailboxSession) {
         try {
             MessageManager mailbox = mailboxManager.getMailbox(mailboxPath, mailboxSession);
-            return fromMessageManager(mailbox, mailboxSession);
+            return fromMessageManager(mailbox, Optional.empty(), mailboxSession);
         } catch (MailboxException e) {
             LOGGER.warn("Cannot find mailbox for: " + mailboxPath.getName(), e);
             return Optional.empty();
@@ -63,20 +63,30 @@ public class MailboxFactory {
     public Optional<Mailbox> fromMailboxId(MailboxId mailboxId, MailboxSession mailboxSession) {
         try {
             MessageManager mailbox = mailboxManager.getMailbox(mailboxId, mailboxSession);
-            return fromMessageManager(mailbox, mailboxSession);
+            return fromMessageManager(mailbox, Optional.empty(), mailboxSession);
         } catch (MailboxException e) {
             return Optional.empty();
         }
     }
 
-    private Optional<Mailbox> fromMessageManager(MessageManager messageManager, MailboxSession mailboxSession) throws MailboxException {
+    public Optional<Mailbox> fromMailboxId(MailboxId mailboxId, List<MailboxMetaData> userMailboxesMetadata, MailboxSession mailboxSession) {
+        try {
+            MessageManager mailbox = mailboxManager.getMailbox(mailboxId, mailboxSession);
+            return fromMessageManager(mailbox, Optional.of(userMailboxesMetadata), mailboxSession);
+        } catch (MailboxException e) {
+            return Optional.empty();
+        }
+    }
+
+    private Optional<Mailbox> fromMessageManager(MessageManager messageManager, Optional<List<MailboxMetaData>> userMailboxesMetadata,
+                                                 MailboxSession mailboxSession) throws MailboxException {
         MailboxPath mailboxPath = messageManager.getMailboxPath();
         Optional<Role> role = Role.from(mailboxPath.getName());
         MailboxCounters mailboxCounters = messageManager.getMailboxCounters(mailboxSession);
         return Optional.ofNullable(Mailbox.builder()
                 .id(messageManager.getId())
                 .name(getName(mailboxPath, mailboxSession))
-                .parentId(getParentIdFromMailboxPath(mailboxPath, mailboxSession).orElse(null))
+                .parentId(getParentIdFromMailboxPath(mailboxPath, userMailboxesMetadata, mailboxSession).orElse(null))
                 .role(role)
                 .unreadMessages(mailboxCounters.getUnseen())
                 .totalMessages(mailboxCounters.getCount())
@@ -93,17 +103,27 @@ public class MailboxFactory {
         return name;
     }
 
-    @VisibleForTesting Optional<MailboxId> getParentIdFromMailboxPath(MailboxPath mailboxPath, MailboxSession mailboxSession) throws MailboxException {
+    @VisibleForTesting Optional<MailboxId> getParentIdFromMailboxPath(MailboxPath mailboxPath, Optional<List<MailboxMetaData>> userMailboxesMetadata,
+                                                                      MailboxSession mailboxSession) throws MailboxException {
         List<MailboxPath> levels = mailboxPath.getHierarchyLevels(mailboxSession.getPathDelimiter());
         if (levels.size() <= 1) {
             return Optional.empty();
         }
         MailboxPath parent = levels.get(levels.size() - 2);
-        return Optional.of(getMailboxId(parent, mailboxSession));
+        return userMailboxesMetadata.map(list -> retrieveParentFromMetadata(parent, list))
+            .orElse(retrieveParentFromBackend(mailboxSession, parent));
+    }
+
+    private Optional<MailboxId> retrieveParentFromBackend(MailboxSession mailboxSession, MailboxPath parent) throws MailboxException {
+        return Optional.of(
+            mailboxManager.getMailbox(parent, mailboxSession)
+                .getId());
     }
 
-    private MailboxId getMailboxId(MailboxPath mailboxPath, MailboxSession mailboxSession) throws MailboxException {
-        return mailboxManager.getMailbox(mailboxPath, mailboxSession)
-                .getId();
+    private Optional<MailboxId> retrieveParentFromMetadata(MailboxPath parent, List<MailboxMetaData> list) {
+        return list.stream()
+            .filter(metadata -> metadata.getPath().equals(parent))
+            .map(MailboxMetaData::getId)
+            .findAny();
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/bdc76d13/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
index 9964921..7be9c73 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
@@ -30,13 +30,17 @@ import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.SimpleMailboxMetaData;
 import org.junit.Before;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableList;
+
 public class MailboxFactoryTest {
     private static final Logger LOGGER = LoggerFactory.getLogger(MailboxUtilsTest.class);
+    public static final char DELIMITER = '.';
 
     private MailboxManager mailboxManager;
     private MailboxSession mailboxSession;
@@ -120,7 +124,7 @@ public class MailboxFactoryTest {
         MailboxPath mailboxPath = new MailboxPath("#private", user, "mailbox");
         mailboxManager.createMailbox(mailboxPath, mailboxSession);
 
-        Optional<MailboxId> id = sut.getParentIdFromMailboxPath(mailboxPath, mailboxSession);
+        Optional<MailboxId> id = sut.getParentIdFromMailboxPath(mailboxPath, Optional.empty(), mailboxSession);
         assertThat(id).isEmpty();
     }
 
@@ -133,7 +137,7 @@ public class MailboxFactoryTest {
         MailboxPath mailboxPath = new MailboxPath("#private", user, "inbox.mailbox");
         mailboxManager.createMailbox(mailboxPath, mailboxSession);
 
-        Optional<MailboxId> id = sut.getParentIdFromMailboxPath(mailboxPath, mailboxSession);
+        Optional<MailboxId> id = sut.getParentIdFromMailboxPath(mailboxPath, Optional.empty(), mailboxSession);
         assertThat(id).contains(parentId);
     }
 
@@ -148,7 +152,24 @@ public class MailboxFactoryTest {
 
         mailboxManager.createMailbox(mailboxPath, mailboxSession);
 
-        Optional<MailboxId> id = sut.getParentIdFromMailboxPath(mailboxPath, mailboxSession);
+        Optional<MailboxId> id = sut.getParentIdFromMailboxPath(mailboxPath, Optional.empty(), mailboxSession);
+        assertThat(id).contains(parentId);
+    }
+
+    @Test
+    public void getParentIdFromMailboxPathShouldWorkWhenUserMailboxesProvided() throws Exception {
+        MailboxPath mailboxPath = new MailboxPath("#private", user, "inbox.children.mailbox");
+        mailboxManager.createMailbox(new MailboxPath("#private", user, "inbox"), mailboxSession);
+
+        MailboxPath parentMailboxPath = new MailboxPath("#private", user, "inbox.children");
+        mailboxManager.createMailbox(parentMailboxPath, mailboxSession);
+        MailboxId parentId = mailboxManager.getMailbox(parentMailboxPath, mailboxSession).getId();
+
+        mailboxManager.createMailbox(mailboxPath, mailboxSession);
+
+        Optional<MailboxId> id = sut.getParentIdFromMailboxPath(mailboxPath,
+            Optional.of(ImmutableList.of(new SimpleMailboxMetaData(parentMailboxPath, parentId, DELIMITER))),
+            mailboxSession);
         assertThat(id).contains(parentId);
     }
 


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