Author: matthieu
Date: Fri Dec 11 12:33:51 2015
New Revision: 1719387
URL: http://svn.apache.org/viewvc?rev=1719387&view=rev
Log:
JAMES-1644 Implement limit in GetMessageListMethod
Modified:
james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/jmap/MethodsModule.java
james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/modules/TestJMAPServerModule.java
james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapServer.java
james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessageListMethodTest.java
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
Modified:
james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/jmap/MethodsModule.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/jmap/MethodsModule.java?rev=1719387&r1=1719386&r2=1719387&view=diff
==============================================================================
---
james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/jmap/MethodsModule.java
(original)
+++
james/project/trunk/server/container/cassandra-guice/src/main/java/org/apache/james/jmap/MethodsModule.java
Fri Dec 11 12:33:51 2015
@@ -34,6 +34,7 @@ import com.google.inject.AbstractModule;
import com.google.inject.Singleton;
import com.google.inject.TypeLiteral;
import com.google.inject.multibindings.Multibinder;
+import com.google.inject.name.Names;
public class MethodsModule extends AbstractModule {
@@ -44,6 +45,8 @@ public class MethodsModule extends Abstr
bind(JmapRequestParser.class).to(JmapRequestParserImpl.class).in(Singleton.class);
bind(JmapResponseWriter.class).to(JmapResponseWriterImpl.class).in(Singleton.class);
+
bindConstant().annotatedWith(Names.named(GetMessageListMethod.MAXIMUM_LIMIT)).to(GetMessageListMethod.DEFAULT_MAXIMUM_LIMIT);
+
Multibinder<Method> methods = Multibinder.newSetBinder(binder(),
Method.class);
methods.addBinding().to(new
TypeLiteral<GetMailboxesMethod<CassandraId>>(){});
methods.addBinding().to(new
TypeLiteral<GetMessageListMethod<CassandraId>>(){});
Modified:
james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java?rev=1719387&r1=1719386&r2=1719387&view=diff
==============================================================================
---
james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
(original)
+++
james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
Fri Dec 11 12:33:51 2015
@@ -31,6 +31,7 @@ import java.nio.charset.Charset;
import org.apache.james.backends.cassandra.CassandraCluster;
import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.jmap.methods.GetMessageListMethod;
import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
import org.apache.james.modules.TestElasticSearchModule;
import org.apache.james.modules.TestFilesystemModule;
@@ -83,7 +84,7 @@ public class CassandraJamesServerTest {
return Modules.override(CassandraJamesServerMain.defaultModule)
.with(new TestElasticSearchModule(embeddedElasticSearch),
new TestFilesystemModule(temporaryFolder),
- new TestJMAPServerModule(),
+ new
TestJMAPServerModule(GetMessageListMethod.DEFAULT_MAXIMUM_LIMIT),
new AbstractModule() {
@Override
Modified:
james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/modules/TestJMAPServerModule.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/modules/TestJMAPServerModule.java?rev=1719387&r1=1719386&r2=1719387&view=diff
==============================================================================
---
james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/modules/TestJMAPServerModule.java
(original)
+++
james/project/trunk/server/container/cassandra-guice/src/test/java/org/apache/james/modules/TestJMAPServerModule.java
Fri Dec 11 12:33:51 2015
@@ -27,15 +27,24 @@ import javax.inject.Singleton;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.james.jmap.JMAPConfiguration;
import org.apache.james.jmap.PortConfiguration;
+import org.apache.james.jmap.methods.GetMessageListMethod;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
+import com.google.inject.name.Names;
public class TestJMAPServerModule extends AbstractModule{
+ private final int maximumLimit;
+
+ public TestJMAPServerModule(int maximumLimit) {
+ this.maximumLimit = maximumLimit;
+ }
+
@Override
protected void configure() {
bind(PortConfiguration.class).to(RandomPortConfiguration.class).in(Singleton.class);
+
bindConstant().annotatedWith(Names.named(GetMessageListMethod.MAXIMUM_LIMIT)).to(maximumLimit);
}
@Provides
Modified:
james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapServer.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapServer.java?rev=1719387&r1=1719386&r2=1719387&view=diff
==============================================================================
---
james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapServer.java
(original)
+++
james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapServer.java
Fri Dec 11 12:33:51 2015
@@ -42,6 +42,8 @@ import com.google.inject.util.Modules;
public class CassandraJmapServer implements JmapServer {
+ private static final int LIMIT_TO_3_MESSAGES = 3;
+
private CassandraJamesServer server;
private CassandraCluster cassandra;
@@ -55,7 +57,7 @@ public class CassandraJmapServer impleme
return Modules.override(CassandraJamesServerMain.defaultModule)
.with(new TestElasticSearchModule(embeddedElasticSearch),
new TestFilesystemModule(temporaryFolder),
- new TestJMAPServerModule(),
+ new TestJMAPServerModule(LIMIT_TO_3_MESSAGES),
new AbstractModule() {
@Override
Modified:
james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessageListMethodTest.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessageListMethodTest.java?rev=1719387&r1=1719386&r2=1719387&view=diff
==============================================================================
---
james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessageListMethodTest.java
(original)
+++
james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessageListMethodTest.java
Fri Dec 11 12:33:51 2015
@@ -358,4 +358,89 @@ public abstract class GetMessageListMeth
+
"\"canCalculateUpdates\":false,\"position\":0,\"total\":0,\"threadIds\":[],\"messageIds\":[\"2\"]},"
+ "\"#0\"]]"));
}
+
+ @Test
+ public void getMessageListShouldReturnAllMessagesWhenLimitIsNotGiven()
throws Exception {
+ String user = "user";
+
jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, user,
"mailbox");
+
+ LocalDate date = LocalDate.now();
+ jmapServer.serverProbe().appendMessage(user, new
MailboxPath(MailboxConstants.USER_NAMESPACE, user, "mailbox"),
+ new ByteArrayInputStream("Subject:
test\r\n\r\ntestmail".getBytes()), new Date(date.plusDays(1).toEpochDay()),
false, new Flags());
+ jmapServer.serverProbe().appendMessage(user, new
MailboxPath(MailboxConstants.USER_NAMESPACE, user, "mailbox"),
+ new ByteArrayInputStream("Subject:
test2\r\n\r\ntestmail".getBytes()), new Date(date.toEpochDay()), false, new
Flags());
+ embeddedElasticSearch.awaitForElasticSearch();
+
+ given()
+ .accept(ContentType.JSON)
+ .contentType(ContentType.JSON)
+ .header("Authorization", accessToken.serialize())
+ .body("[[\"getMessageList\", {}, \"#0\"]]")
+ .when()
+ .post("/jmap")
+ .then()
+ .statusCode(200)
+ .content(startsWith("[[\"getMessageList\","
+ +
"{\"accountId\":null,\"filter\":null,\"sort\":[],\"collapseThreads\":false,\"state\":null,"
+ +
"\"canCalculateUpdates\":false,\"position\":0,\"total\":0,\"threadIds\":[],\"messageIds\":[\"1\",\"2\"]},"
+ + "\"#0\"]]"));
+ }
+
+ @Test
+ public void getMessageListShouldReturnLimitMessagesWhenLimitGiven() throws
Exception {
+ String user = "user";
+
jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, user,
"mailbox");
+
+ LocalDate date = LocalDate.now();
+ jmapServer.serverProbe().appendMessage(user, new
MailboxPath(MailboxConstants.USER_NAMESPACE, user, "mailbox"),
+ new ByteArrayInputStream("Subject:
test\r\n\r\ntestmail".getBytes()), new Date(date.plusDays(1).toEpochDay()),
false, new Flags());
+ jmapServer.serverProbe().appendMessage(user, new
MailboxPath(MailboxConstants.USER_NAMESPACE, user, "mailbox"),
+ new ByteArrayInputStream("Subject:
test2\r\n\r\ntestmail".getBytes()), new Date(date.toEpochDay()), false, new
Flags());
+ embeddedElasticSearch.awaitForElasticSearch();
+
+ given()
+ .accept(ContentType.JSON)
+ .contentType(ContentType.JSON)
+ .header("Authorization", accessToken.serialize())
+ .body("[[\"getMessageList\", {\"limit\":1}, \"#0\"]]")
+ .when()
+ .post("/jmap")
+ .then()
+ .statusCode(200)
+ .content(startsWith("[[\"getMessageList\","
+ +
"{\"accountId\":null,\"filter\":null,\"sort\":[],\"collapseThreads\":false,\"state\":null,"
+ +
"\"canCalculateUpdates\":false,\"position\":0,\"total\":0,\"threadIds\":[],\"messageIds\":[\"1\"]},"
+ + "\"#0\"]]"));
+ }
+
+ @Test
+ public void
getMessageListShouldReturnLimitMessagesWithDefaultValueWhenLimitIsNotGiven()
throws Exception {
+ String user = "user";
+
jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, user,
"mailbox");
+
+ LocalDate date = LocalDate.now();
+ jmapServer.serverProbe().appendMessage(user, new
MailboxPath(MailboxConstants.USER_NAMESPACE, user, "mailbox"),
+ new ByteArrayInputStream("Subject:
test\r\n\r\ntestmail".getBytes()), new Date(date.plusDays(1).toEpochDay()),
false, new Flags());
+ jmapServer.serverProbe().appendMessage(user, new
MailboxPath(MailboxConstants.USER_NAMESPACE, user, "mailbox"),
+ new ByteArrayInputStream("Subject:
test2\r\n\r\ntestmail".getBytes()), new Date(date.toEpochDay()), false, new
Flags());
+ jmapServer.serverProbe().appendMessage(user, new
MailboxPath(MailboxConstants.USER_NAMESPACE, user, "mailbox"),
+ new ByteArrayInputStream("Subject:
test3\r\n\r\ntestmail".getBytes()), new Date(date.toEpochDay()), false, new
Flags());
+ jmapServer.serverProbe().appendMessage(user, new
MailboxPath(MailboxConstants.USER_NAMESPACE, user, "mailbox"),
+ new ByteArrayInputStream("Subject:
test4\r\n\r\ntestmail".getBytes()), new Date(date.toEpochDay()), false, new
Flags());
+ embeddedElasticSearch.awaitForElasticSearch();
+
+ given()
+ .accept(ContentType.JSON)
+ .contentType(ContentType.JSON)
+ .header("Authorization", accessToken.serialize())
+ .body("[[\"getMessageList\", {}, \"#0\"]]")
+ .when()
+ .post("/jmap")
+ .then()
+ .statusCode(200)
+ .content(startsWith("[[\"getMessageList\","
+ +
"{\"accountId\":null,\"filter\":null,\"sort\":[],\"collapseThreads\":false,\"state\":null,"
+ +
"\"canCalculateUpdates\":false,\"position\":0,\"total\":0,\"threadIds\":[],\"messageIds\":[\"1\",\"2\",\"3\"]},"
+ + "\"#0\"]]"));
+ }
}
Modified:
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java?rev=1719387&r1=1719386&r2=1719387&view=diff
==============================================================================
---
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
(original)
+++
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
Fri Dec 11 12:33:51 2015
@@ -25,6 +25,7 @@ import java.util.Optional;
import java.util.stream.Collectors;
import javax.inject.Inject;
+import javax.inject.Named;
import org.apache.james.jmap.model.FilterCondition;
import org.apache.james.jmap.model.GetMessageListRequest;
@@ -54,17 +55,24 @@ import com.google.common.collect.Immutab
public class GetMessageListMethod<Id extends MailboxId> implements Method {
+ public static final String MAXIMUM_LIMIT = "maximumLimit";
+ public static final int DEFAULT_MAXIMUM_LIMIT = 256;
+
private static final Logger LOGGER =
LoggerFactory.getLogger(GetMailboxesMethod.class);
private static final Method.Name METHOD_NAME =
Method.name("getMessageList");
private static final int NO_LIMIT = -1;
private final MailboxManager mailboxManager;
private final MailboxSessionMapperFactory<Id> mailboxSessionMapperFactory;
+ private final int maximumLimit;
@Inject
- @VisibleForTesting public GetMessageListMethod(MailboxManager
mailboxManager, MailboxSessionMapperFactory<Id> mailboxSessionMapperFactory) {
+ @VisibleForTesting public GetMessageListMethod(MailboxManager
mailboxManager, MailboxSessionMapperFactory<Id> mailboxSessionMapperFactory,
+ @Named(MAXIMUM_LIMIT) int maximumLimit) {
+
this.mailboxManager = mailboxManager;
this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
+ this.maximumLimit = maximumLimit;
}
@Override
@@ -97,6 +105,7 @@ public class GetMessageListMethod<Id ext
.flatMap(List::stream)
.sorted(comparatorFor(jmapRequest))
.skip(jmapRequest.getPosition())
+ .limit(limit(jmapRequest.getLimit()))
.map(Message::getUid)
.map(String::valueOf)
.forEach(builder::messageId);
@@ -104,6 +113,10 @@ public class GetMessageListMethod<Id ext
return builder.build();
}
+ private long limit(Optional<Integer> limit) {
+ return limit.orElse(maximumLimit);
+ }
+
private Comparator<Message<Id>> comparatorFor(GetMessageListRequest
jmapRequest) {
return SortToComparatorConvertor.comparatorFor(jmapRequest.getSort());
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]