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