Author: matthieu Date: Mon Jan 18 22:06:31 2016 New Revision: 1725359 URL: http://svn.apache.org/viewvc?rev=1725359&view=rev Log: JAMES-1657 getMessageList takes some mailboxIds, not mailboxes names
Modified: 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/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=1725359&r1=1725358&r2=1725359&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 Mon Jan 18 22:06:31 2016 @@ -20,6 +20,7 @@ package org.apache.james.jmap.methods; import static com.jayway.restassured.RestAssured.given; +import static com.jayway.restassured.RestAssured.with; import static com.jayway.restassured.config.EncoderConfig.encoderConfig; import static com.jayway.restassured.config.RestAssuredConfig.newConfig; import static org.assertj.core.api.Assertions.assertThat; @@ -156,16 +157,24 @@ public abstract class GetMessageListMeth @Test public void getMessageListShouldFilterMessagesWhenInMailboxesFilterMatches() throws Exception { jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox"); - 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()); embeddedElasticSearch.awaitForElasticSearch(); + String mailboxId = + with() + .accept(ContentType.JSON) + .contentType(ContentType.JSON) + .header("Authorization", accessToken.serialize()) + .body("[[\"getMailboxes\", {}, \"#0\"]]") + .post("/jmap") + .path("[0][1].list[0].id"); + String response = given() .accept(ContentType.JSON) .contentType(ContentType.JSON) .header("Authorization", accessToken.serialize()) - .body("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"mailbox\"]}}, \"#0\"]]") + .body("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"" + mailboxId + "\"]}}, \"#0\"]]") .when() .post("/jmap") .then() @@ -187,11 +196,20 @@ public abstract class GetMessageListMeth jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox2"); embeddedElasticSearch.awaitForElasticSearch(); + List<String> mailboxIds = + with() + .accept(ContentType.JSON) + .contentType(ContentType.JSON) + .header("Authorization", accessToken.serialize()) + .body("[[\"getMailboxes\", {}, \"#0\"]]") + .post("/jmap") + .path("[0][1].list.id"); + String response = given() .accept(ContentType.JSON) .contentType(ContentType.JSON) .header("Authorization", accessToken.serialize()) - .body("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"mailbox\",\"mailbox2\"]}}, \"#0\"]]") + .body(String.format("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"%s\", \"%s\"]}}, \"#0\"]]", mailboxIds.get(0), mailboxIds.get(1))) .when() .post("/jmap") .then() 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=1725359&r1=1725358&r2=1725359&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 Mon Jan 18 22:06:31 2016 @@ -22,7 +22,7 @@ package org.apache.james.jmap.methods; import java.util.Comparator; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; +import java.util.Set; import java.util.stream.Stream; import javax.inject.Inject; @@ -42,11 +42,13 @@ import org.apache.james.mailbox.model.Ma import org.apache.james.mailbox.model.MessageRange; import org.apache.james.mailbox.model.SearchQuery; import org.apache.james.mailbox.store.MailboxSessionMapperFactory; +import org.apache.james.mailbox.store.StoreMailboxPath; import org.apache.james.mailbox.store.mail.MessageMapper; import org.apache.james.mailbox.store.mail.MessageMapper.FetchType; import org.apache.james.mailbox.store.mail.model.Mailbox; import org.apache.james.mailbox.store.mail.model.MailboxId; import org.apache.james.mailbox.store.mail.model.MailboxMessage; +import org.apache.james.util.streams.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,6 +57,8 @@ import com.google.common.annotations.Vis import com.google.common.base.Preconditions; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; public class GetMessageListMethod<Id extends MailboxId> implements Method { @@ -103,14 +107,14 @@ public class GetMessageListMethod<Id ext GetMessageListResponse.Builder builder = GetMessageListResponse.builder(); try { - mailboxManager.list(mailboxSession) - .stream() - .filter(mailboxPath -> isMailboxRequested(jmapRequest, mailboxPath)) - .flatMap(mailboxPath -> listMessages(mailboxPath, mailboxSession, jmapRequest)) - .skip(jmapRequest.getPosition()) - .limit(limit(jmapRequest.getLimit())) - .map(MessageId::serialize) - .forEach(builder::messageId); + List<MailboxPath> mailboxPaths = mailboxManager.list(mailboxSession); + listRequestedMailboxes(jmapRequest, mailboxPaths, mailboxSession) + .stream() + .flatMap(mailboxPath -> listMessages(mailboxPath, mailboxSession, jmapRequest)) + .skip(jmapRequest.getPosition()) + .limit(limit(jmapRequest.getLimit())) + .map(MessageId::serialize) + .forEach(builder::messageId); return builder.build(); } catch (MailboxException e) { @@ -132,22 +136,26 @@ public class GetMessageListMethod<Id ext return SortToComparatorConvertor.comparatorFor(jmapRequest.getSort()); } - private boolean isMailboxRequested(GetMessageListRequest jmapRequest, MailboxPath mailboxPath) { - if (jmapRequest.getFilter().isPresent()) { - return jmapRequest.getFilter() - .filter(FilterCondition.class::isInstance) - .map(FilterCondition.class::cast) - .map(FilterCondition::getInMailboxes) - .filter(list -> isMailboxInList(mailboxPath, list)) - .isPresent(); - } - return true; - } - - private boolean isMailboxInList(MailboxPath mailboxPath, List<String> inMailboxes) { - return inMailboxes.contains(mailboxPath.getName()); + private ImmutableSet<MailboxPath> listRequestedMailboxes(GetMessageListRequest jmapRequest, List<MailboxPath> mailboxPaths, MailboxSession session) { + ImmutableSet<MailboxPath> mailboxPathSet = ImmutableSet.copyOf(mailboxPaths); + return jmapRequest.getFilter() + .filter(FilterCondition.class::isInstance) + .map(FilterCondition.class::cast) + .map(FilterCondition::getInMailboxes) + .map(Throwing.function(mailboxIds -> mailboxIdsToMailboxPaths(mailboxIds, session))) + .map(requestedMailboxPaths -> Sets.intersection(requestedMailboxPaths, mailboxPathSet).immutableCopy()) + .orElse(mailboxPathSet); + } + + private Set<MailboxPath> mailboxIdsToMailboxPaths(List<String> mailboxIds, MailboxSession session) throws MailboxException { + Set<String> mailboxIdSet = Sets.newHashSet(mailboxIds); + return mailboxSessionMapperFactory.createMailboxMapper(session).list() + .stream() + .filter(mailbox -> mailboxIdSet.contains(mailbox.getMailboxId().serialize())) + .map(mailbox -> new StoreMailboxPath<>(mailbox)) + .collect(Collectors.toImmutableSet()); } - + private Optional<MessageManager> getMessageManager(MailboxPath mailboxPath, MailboxSession mailboxSession) { try { return Optional.of(mailboxManager.getMailbox(mailboxPath, mailboxSession)); @@ -166,7 +174,7 @@ public class GetMessageListMethod<Id ext return ImmutableList.copyOf(messageManager.get().search(searchQuery, mailboxSession)) .stream() .map(Throwing.function(messageId -> getMessage(mailboxPath, mailboxSession, messageMapper, messageId))) - .collect(Collectors.toList()); + .collect(Collectors.toImmutableList()); } catch (MailboxException e) { LOGGER.warn("Error when searching messages for query :" + searchQuery, e); return ImmutableList.of(); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org