Author: aduprat
Date: Wed Jan 13 10:11:53 2016
New Revision: 1724384

URL: http://svn.apache.org/viewvc?rev=1724384&view=rev
Log:
JAMES-1648 Method can return a response Stream. Contributed by Baechler 
<matthieu.baech...@gmail.com>

Modified:
    
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java
    
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
    
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
    
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
    
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriter.java
    
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java
    
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java
    
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java
    
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java
    
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
    
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
    
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java
    
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java

Modified: 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java?rev=1724384&r1=1724383&r2=1724384&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java
 Wed Jan 13 10:11:53 2016
@@ -63,7 +63,7 @@ public class JMAPServlet extends HttpSer
                 requestAsJsonStream(req)
                 .map(ProtocolRequest::deserialize)
                 .map(x -> AuthenticatedProtocolRequest.decorate(x, req))
-                .map(requestHandler::handle)
+                .flatMap(requestHandler::handle)
                 .map(ProtocolResponse::asProtocolSpecification)
                 .collect(Collectors.toList());
 

Modified: 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java?rev=1724384&r1=1724383&r2=1724384&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
 Wed Jan 13 10:11:53 2016
@@ -20,9 +20,11 @@
 package org.apache.james.jmap.methods;
 
 import java.util.Optional;
+import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
+import org.apache.james.jmap.model.ClientId;
 import org.apache.james.jmap.model.GetMailboxesRequest;
 import org.apache.james.jmap.model.GetMailboxesResponse;
 import org.apache.james.jmap.model.mailbox.Mailbox;
@@ -65,35 +67,31 @@ public class GetMailboxesMethod<Id exten
     }
 
     @Override
-    public Method.Response.Name responseName() {
-        return RESPONSE_NAME;
-    }
-    
-    @Override
     public Class<? extends JmapRequest> requestType() {
         return GetMailboxesRequest.class;
     }
-    
-    @Override
-    public GetMailboxesResponse process(JmapRequest request, MailboxSession 
mailboxSession) {
+
+    public Stream<JmapResponse> process(JmapRequest request, ClientId 
clientId, MailboxSession mailboxSession) {
         Preconditions.checkArgument(request instanceof GetMailboxesRequest);
+        return Stream.of(
+                JmapResponse.builder().clientId(clientId)
+                .response(getMailboxesResponse(mailboxSession))
+                .responseName(RESPONSE_NAME)
+                .build());
+    }
+
+    private GetMailboxesResponse getMailboxesResponse(MailboxSession 
mailboxSession) {
+        GetMailboxesResponse.Builder builder = GetMailboxesResponse.builder();
         try {
-            return getMailboxesResponse(mailboxSession);
+            mailboxManager.list(mailboxSession)
+                .stream()
+                .map(mailboxPath -> mailboxFromMailboxPath(mailboxPath, 
mailboxSession))
+                .forEach(mailbox -> builder.add(mailbox.get()));
+            return builder.build();
         } catch (MailboxException e) {
             throw Throwables.propagate(e);
         }
     }
-
-    private GetMailboxesResponse getMailboxesResponse(MailboxSession 
mailboxSession) throws MailboxException {
-        GetMailboxesResponse.Builder builder = GetMailboxesResponse.builder();
-
-        mailboxManager.list(mailboxSession)
-            .stream()
-            .map(mailboxPath -> mailboxFromMailboxPath(mailboxPath, 
mailboxSession))
-            .forEach(mailbox -> builder.add(mailbox.get()));
-
-        return builder.build();
-    }
     
     private Optional<Mailbox> mailboxFromMailboxPath(MailboxPath mailboxPath, 
MailboxSession mailboxSession) {
         try {

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=1724384&r1=1724383&r2=1724384&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
 Wed Jan 13 10:11:53 2016
@@ -28,6 +28,7 @@ import java.util.stream.Stream;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.james.jmap.model.ClientId;
 import org.apache.james.jmap.model.FilterCondition;
 import org.apache.james.jmap.model.GetMessageListRequest;
 import org.apache.james.jmap.model.GetMessageListResponse;
@@ -84,38 +85,37 @@ public class GetMessageListMethod<Id ext
     }
 
     @Override
-    public Method.Response.Name responseName() {
-        return RESPONSE_NAME;
-    }
-    
-    @Override
     public Class<? extends JmapRequest> requestType() {
         return GetMessageListRequest.class;
     }
 
     @Override
-    public GetMessageListResponse process(JmapRequest request, MailboxSession 
mailboxSession) {
+    public Stream<JmapResponse> process(JmapRequest request, ClientId 
clientId, MailboxSession mailboxSession) {
         Preconditions.checkArgument(request instanceof GetMessageListRequest);
-        try {
-            return getMessageListResponse((GetMessageListRequest) request, 
mailboxSession);
-        } catch (MailboxException e) {
-            throw Throwables.propagate(e);
-        }
+        return Stream.of(
+                JmapResponse.builder().clientId(clientId)
+                .response(getMessageListResponse((GetMessageListRequest) 
request, mailboxSession))
+                .responseName(RESPONSE_NAME)
+                .build());
     }
 
-    private GetMessageListResponse 
getMessageListResponse(GetMessageListRequest jmapRequest, MailboxSession 
mailboxSession) throws MailboxException {
+    private GetMessageListResponse 
getMessageListResponse(GetMessageListRequest jmapRequest, MailboxSession 
mailboxSession) {
         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);
+            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);
 
-        return builder.build();
+            return builder.build();
+        } catch (MailboxException e) {
+            throw Throwables.propagate(e);
+        }
     }
 
     private Stream<MessageId> listMessages(MailboxPath mailboxPath, 
MailboxSession mailboxSession, GetMessageListRequest jmapRequest) {

Modified: 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java?rev=1724384&r1=1724383&r2=1724384&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
 Wed Jan 13 10:11:53 2016
@@ -29,6 +29,7 @@ import java.util.stream.StreamSupport;
 import javax.inject.Inject;
 
 import org.apache.commons.lang.NotImplementedException;
+import org.apache.james.jmap.model.ClientId;
 import org.apache.james.jmap.model.GetMessagesRequest;
 import org.apache.james.jmap.model.GetMessagesResponse;
 import org.apache.james.jmap.model.Message;
@@ -70,21 +71,23 @@ public class GetMessagesMethod<Id extend
     }
     
     @Override
-    public Method.Response.Name responseName() {
-        return RESPONSE_NAME;
-    }
-    
-    @Override
     public Class<? extends JmapRequest> requestType() {
         return GetMessagesRequest.class;
     }
     
     @Override
-    public GetMessagesResponse process(JmapRequest request, MailboxSession 
mailboxSession) {
+    public Stream<JmapResponse> process(JmapRequest request, ClientId 
clientId, MailboxSession mailboxSession) {
         Preconditions.checkNotNull(request);
         Preconditions.checkNotNull(mailboxSession);
         Preconditions.checkArgument(request instanceof GetMessagesRequest);
         GetMessagesRequest getMessagesRequest = (GetMessagesRequest) request;
+        return Stream.of(JmapResponse.builder().clientId(clientId)
+                            .response(getMessagesResponse(mailboxSession, 
getMessagesRequest))
+                            .responseName(RESPONSE_NAME)
+                            .build());
+    }
+
+    private GetMessagesResponse getMessagesResponse(MailboxSession 
mailboxSession, GetMessagesRequest getMessagesRequest) {
         
getMessagesRequest.getAccountId().ifPresent(GetMessagesMethod::notImplemented);
         
         Function<MessageId, Stream<Pair<MailboxMessage<Id>, MailboxPath>>> 
loadMessages = loadMessage(mailboxSession);

Modified: 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriter.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriter.java?rev=1724384&r1=1724383&r2=1724384&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriter.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriter.java
 Wed Jan 13 10:11:53 2016
@@ -21,8 +21,10 @@ package org.apache.james.jmap.methods;
 
 import org.apache.james.jmap.model.ProtocolResponse;
 
+import java.util.stream.Stream;
+
 public interface JmapResponseWriter {
 
-    ProtocolResponse formatMethodResponse(JmapResponse jmapResponse);
+    Stream<ProtocolResponse> formatMethodResponse(Stream<JmapResponse> 
jmapResponse);
 
 }
\ No newline at end of file

Modified: 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java?rev=1724384&r1=1724383&r2=1724384&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java
 Wed Jan 13 10:11:53 2016
@@ -21,6 +21,7 @@ package org.apache.james.jmap.methods;
 
 import java.util.Optional;
 import java.util.Set;
+import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
@@ -44,13 +45,15 @@ public class JmapResponseWriterImpl impl
     }
 
     @Override
-    public ProtocolResponse formatMethodResponse(JmapResponse jmapResponse) {
-        ObjectMapper objectMapper = newConfiguredObjectMapper(jmapResponse);
-        
-        return new ProtocolResponse(
-                jmapResponse.getResponseName(), 
-                objectMapper.valueToTree(jmapResponse.getResponse()), 
-                jmapResponse.getClientId());
+    public Stream<ProtocolResponse> formatMethodResponse(Stream<JmapResponse> 
jmapResponses) {
+        return jmapResponses.map(jmapResponse -> {
+            ObjectMapper objectMapper = 
newConfiguredObjectMapper(jmapResponse);
+
+            return new ProtocolResponse(
+                    jmapResponse.getResponseName(),
+                    objectMapper.valueToTree(jmapResponse.getResponse()),
+                    jmapResponse.getClientId());
+        });
     }
     
     private FilterProvider buildPropertiesFilter(Optional<Set<String>> 
properties) {

Modified: 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java?rev=1724384&r1=1724383&r2=1724384&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java
 Wed Jan 13 10:11:53 2016
@@ -22,7 +22,9 @@ package org.apache.james.jmap.methods;
 import static com.google.common.base.Objects.toStringHelper;
 
 import java.util.Objects;
+import java.util.stream.Stream;
 
+import org.apache.james.jmap.model.ClientId;
 import org.apache.james.mailbox.MailboxSession;
 
 import com.fasterxml.jackson.annotation.JsonValue;
@@ -118,10 +120,8 @@ public interface Method {
 
     Request.Name requestHandled();
 
-    Response.Name responseName();
-    
     Class<? extends JmapRequest> requestType();
     
-    Response process(JmapRequest request, MailboxSession mailboxSession);
+    Stream<JmapResponse> process(JmapRequest request, ClientId clientId, 
MailboxSession mailboxSession);
 
 }

Modified: 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java?rev=1724384&r1=1724383&r2=1724384&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java
 Wed Jan 13 10:11:53 2016
@@ -25,11 +25,11 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
 import org.apache.commons.lang.NotImplementedException;
-import org.apache.james.jmap.methods.JmapResponse.Builder;
 import org.apache.james.jmap.model.AuthenticatedProtocolRequest;
 import org.apache.james.jmap.model.ProtocolResponse;
 import org.apache.james.mailbox.MailboxSession;
@@ -48,32 +48,31 @@ public class RequestHandler {
                 .collect(Collectors.toMap(Method::requestHandled, 
Function.identity()));
     }
 
-    public ProtocolResponse handle(AuthenticatedProtocolRequest request) {
-        Builder responseBuilder = 
JmapResponse.builder().clientId(request.getClientId());
+    public Stream<ProtocolResponse> handle(AuthenticatedProtocolRequest 
request) {
         return Optional.ofNullable(methods.get(request.getMethodName()))
-                        .map(extractAndProcess(request, responseBuilder))
+                        .map(extractAndProcess(request))
                         .map(jmapResponseWriter::formatMethodResponse)
                         .orElseThrow(() -> new IllegalStateException("unknown 
method"));
     }
     
-    private Function<Method, JmapResponse> 
extractAndProcess(AuthenticatedProtocolRequest request, JmapResponse.Builder 
responseBuilder) {
+    private Function<Method, Stream<JmapResponse>> 
extractAndProcess(AuthenticatedProtocolRequest request) {
         MailboxSession mailboxSession = request.getMailboxSession();
         return (Method method) -> {
                     try {
                         JmapRequest jmapRequest = 
jmapRequestParser.extractJmapRequest(request, method.requestType());
-                        return responseBuilder
-                                .response(method.process(jmapRequest, 
mailboxSession))
-                                .responseName(method.responseName())
-                                .build();
+                        return method.process(jmapRequest, 
request.getClientId(), mailboxSession);
                     } catch (IOException e) {
                         if (e.getCause() instanceof NotImplementedException) {
-                            return responseBuilder.error("Not yet 
implemented").build();
+                            return error(request, "Not yet implemented");
                         }
-                        return 
responseBuilder.error("invalidArguments").build();
+                        return error(request, "invalidArguments");
                     } catch (NotImplementedException e) {
-                        return responseBuilder.error("Not yet 
implemented").build();
+                        return error(request, "Not yet implemented");
                     }
                 };
-        
+    }
+
+    private Stream<JmapResponse> error(AuthenticatedProtocolRequest request, 
String message) {
+        return 
Stream.of(JmapResponse.builder().clientId(request.getClientId()).error(message).build());
     }
 }

Modified: 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java?rev=1724384&r1=1724383&r2=1724384&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java
 Wed Jan 13 10:11:53 2016
@@ -44,6 +44,8 @@ import com.google.common.base.Charsets;
 import com.jayway.restassured.RestAssured;
 import com.jayway.restassured.http.ContentType;
 
+import java.util.stream.Stream;
+
 public class JMAPServletTest {
 
     private JettyHttpServer server;
@@ -92,7 +94,7 @@ public class JMAPServletTest {
         json.put("type", "invalidArgument");
 
         when(requestHandler.handle(any()))
-            .thenReturn(new ProtocolResponse(JmapResponse.ERROR_METHOD, json, 
ClientId.of("#0")));
+            .thenReturn(Stream.of(new 
ProtocolResponse(JmapResponse.ERROR_METHOD, json, ClientId.of("#0"))));
 
         given()
             .accept(ContentType.JSON)
@@ -116,7 +118,7 @@ public class JMAPServletTest {
         arrayNode.add(list);
 
         when(requestHandler.handle(any()))
-            .thenReturn(new ProtocolResponse(Method.Response.name("accounts"), 
json, ClientId.of("#0")));
+            .thenReturn(Stream.of(new 
ProtocolResponse(Method.Response.name("accounts"), json, ClientId.of("#0"))));
 
         given()
             .accept(ContentType.JSON)
@@ -136,5 +138,4 @@ public class JMAPServletTest {
                     "]" + 
                     "},\"#0\"]]"));
     }
-
 }

Modified: 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java?rev=1724384&r1=1724383&r2=1724384&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
 Wed Jan 13 10:11:53 2016
@@ -22,9 +22,12 @@ import static org.assertj.core.api.Asser
 
 import java.io.ByteArrayInputStream;
 import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.mail.Flags;
 
+import org.apache.james.jmap.model.ClientId;
 import org.apache.james.jmap.model.GetMailboxesRequest;
 import org.apache.james.jmap.model.GetMailboxesResponse;
 import org.apache.james.jmap.model.mailbox.Mailbox;
@@ -53,9 +56,11 @@ public class GetMailboxesMethodTest {
 
     private StoreMailboxManager<InMemoryId> mailboxManager;
     private GetMailboxesMethod<InMemoryId> getMailboxesMethod;
-    
+    private ClientId clientId;
+
     @Before
     public void setup() throws Exception {
+        clientId = ClientId.of("#0");
         InMemoryMailboxSessionMapperFactory mailboxMapperFactory = new 
InMemoryMailboxSessionMapperFactory();
         MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
         GroupMembershipResolver groupMembershipResolver = new 
SimpleGroupMembershipResolver();
@@ -71,8 +76,16 @@ public class GetMailboxesMethodTest {
                 .build();
 
         MailboxSession mailboxSession = 
mailboxManager.createSystemSession(USERNAME, LOGGER);
-        GetMailboxesResponse getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, mailboxSession);
-        assertThat(getMailboxesResponse.getList()).isEmpty();
+        
+        List<JmapResponse> getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, clientId, 
mailboxSession).collect(Collectors.toList());
+        
+        assertThat(getMailboxesResponse)
+                .hasSize(1)
+                .extracting(JmapResponse::getResponse)
+                .hasOnlyElementsOfType(GetMailboxesResponse.class)
+                .extracting(GetMailboxesResponse.class::cast)
+                .flatExtracting(GetMailboxesResponse::getList)
+                .isEmpty();
     }
 
     @Test
@@ -87,8 +100,14 @@ public class GetMailboxesMethodTest {
         GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
                 .build();
 
-        GetMailboxesResponse getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, mailboxSession);
-        assertThat(getMailboxesResponse.getList())
+        List<JmapResponse> getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, clientId, 
mailboxSession).collect(Collectors.toList());
+        
+        assertThat(getMailboxesResponse)
+                .hasSize(1)
+                .extracting(JmapResponse::getResponse)
+                .hasOnlyElementsOfType(GetMailboxesResponse.class)
+                .extracting(GetMailboxesResponse.class::cast)
+                .flatExtracting(GetMailboxesResponse::getList)
                 .extracting(Mailbox::getId, Mailbox::getName, 
Mailbox::getUnreadMessages)
                 .containsOnly(Tuple.tuple("1", mailboxPath.getName(), 2L));
     }
@@ -102,9 +121,14 @@ public class GetMailboxesMethodTest {
         GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
                 .build();
 
-        GetMailboxesResponse getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, mailboxSession);
-        assertThat(getMailboxesResponse.getList())
+        List<JmapResponse> getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, clientId, 
mailboxSession).collect(Collectors.toList());
+
+        assertThat(getMailboxesResponse)
                 .hasSize(1)
+                .extracting(JmapResponse::getResponse)
+                .hasOnlyElementsOfType(GetMailboxesResponse.class)
+                .extracting(GetMailboxesResponse.class::cast)
+                .flatExtracting(GetMailboxesResponse::getList)
                 .extracting(Mailbox::getSortOrder)
                 .containsOnly(10);
     }
@@ -118,8 +142,14 @@ public class GetMailboxesMethodTest {
         GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
                 .build();
 
-        GetMailboxesResponse getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, mailboxSession);
-        assertThat(getMailboxesResponse.getList())
+        List<JmapResponse> getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, clientId, 
mailboxSession).collect(Collectors.toList());
+
+        assertThat(getMailboxesResponse)
+                .hasSize(1)
+                .extracting(JmapResponse::getResponse)
+                .hasOnlyElementsOfType(GetMailboxesResponse.class)
+                .extracting(GetMailboxesResponse.class::cast)
+                .flatExtracting(GetMailboxesResponse::getList)
                 .extracting(Mailbox::getSortOrder)
                 .containsOnly(1000);
     }
@@ -133,8 +163,14 @@ public class GetMailboxesMethodTest {
         GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
                 .build();
 
-        GetMailboxesResponse getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, mailboxSession);
-        assertThat(getMailboxesResponse.getList())
+        List<JmapResponse> getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, clientId, 
mailboxSession).collect(Collectors.toList());
+
+        assertThat(getMailboxesResponse)
+                .hasSize(1)
+                .extracting(JmapResponse::getResponse)
+                .hasOnlyElementsOfType(GetMailboxesResponse.class)
+                .extracting(GetMailboxesResponse.class::cast)
+                .flatExtracting(GetMailboxesResponse::getList)
                 .extracting(Mailbox::getSortOrder)
                 .containsOnly(10);
     }
@@ -154,8 +190,14 @@ public class GetMailboxesMethodTest {
         GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
                 .build();
 
-        GetMailboxesResponse getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, mailboxSession);
-        assertThat(getMailboxesResponse.getList())
+        List<JmapResponse> getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, clientId, 
mailboxSession).collect(Collectors.toList());
+
+        assertThat(getMailboxesResponse)
+                .hasSize(1)
+                .extracting(JmapResponse::getResponse)
+                .hasOnlyElementsOfType(GetMailboxesResponse.class)
+                .extracting(GetMailboxesResponse.class::cast)
+                .flatExtracting(GetMailboxesResponse::getList)
                 .extracting(Mailbox::getName, Mailbox::getSortOrder)
                 .containsExactly(
                         Tuple.tuple("INBOX", 10),
@@ -177,8 +219,14 @@ public class GetMailboxesMethodTest {
         GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
                 .build();
 
-        GetMailboxesResponse getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, mailboxSession);
-        assertThat(getMailboxesResponse.getList())
+        List<JmapResponse> getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, clientId, 
mailboxSession).collect(Collectors.toList());
+
+        assertThat(getMailboxesResponse)
+                .hasSize(1)
+                .extracting(JmapResponse::getResponse)
+                .hasOnlyElementsOfType(GetMailboxesResponse.class)
+                .extracting(GetMailboxesResponse.class::cast)
+                .flatExtracting(GetMailboxesResponse::getList)
                 .extracting(Mailbox::getTotalMessages, 
Mailbox::getUnreadMessages)
                 .containsOnly(Tuple.tuple(0L, 0L));
     }
@@ -195,8 +243,14 @@ public class GetMailboxesMethodTest {
         GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
                 .build();
 
-        GetMailboxesResponse getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, mailboxSession);
-        assertThat(getMailboxesResponse.getList())
+        List<JmapResponse> getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, clientId, 
mailboxSession).collect(Collectors.toList());
+
+        assertThat(getMailboxesResponse)
+                .hasSize(1)
+                .extracting(JmapResponse::getResponse)
+                .hasOnlyElementsOfType(GetMailboxesResponse.class)
+                .extracting(GetMailboxesResponse.class::cast)
+                .flatExtracting(GetMailboxesResponse::getList)
                 .extracting(Mailbox::getTotalMessages)
                 .containsExactly(2L);
     }
@@ -215,9 +269,16 @@ public class GetMailboxesMethodTest {
         messageManager.appendMessage(new ByteArrayInputStream("Subject: 
test3\r\n\r\ntestmail".getBytes()), new Date(), mailboxSession, false, 
readMessageFlag);
         GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
                 .build();
-        GetMailboxesResponse getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, mailboxSession);
-        assertThat(getMailboxesResponse.getList())
+
+        List<JmapResponse> getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, clientId, 
mailboxSession).collect(Collectors.toList());
+
+        assertThat(getMailboxesResponse)
+                .hasSize(1)
+                .extracting(JmapResponse::getResponse)
+                .hasOnlyElementsOfType(GetMailboxesResponse.class)
+                .extracting(GetMailboxesResponse.class::cast)
+                .flatExtracting(GetMailboxesResponse::getList)
                 .extracting(Mailbox::getUnreadMessages)
                 .containsExactly(2L);
     }
-}
\ No newline at end of file
+}

Modified: 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java?rev=1724384&r1=1724383&r2=1724384&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
 Wed Jan 13 10:11:53 2016
@@ -26,8 +26,10 @@ import java.io.ByteArrayInputStream;
 import java.util.Date;
 import java.util.List;
 import java.util.Locale;
+import java.util.stream.Collectors;
 
 import org.apache.commons.lang.NotImplementedException;
+import org.apache.james.jmap.model.ClientId;
 import org.apache.james.jmap.model.GetMessagesRequest;
 import org.apache.james.jmap.model.GetMessagesResponse;
 import org.apache.james.jmap.model.Message;
@@ -56,8 +58,6 @@ public class GetMessagesMethodTest {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(GetMessagesMethodTest.class);
     
-    private StoreMailboxManager<InMemoryId> mailboxManager;
-
     private static class User implements 
org.apache.james.mailbox.MailboxSession.User {
         final String username;
         final String password;
@@ -85,14 +85,16 @@ public class GetMessagesMethodTest {
     
     private static final User ROBERT = new User("robert", "secret");
 
+    private StoreMailboxManager<InMemoryId> mailboxManager;
+    private InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory;
+
     private MailboxSession session;
     private MailboxPath inboxPath;
+    private ClientId clientId;
 
-    private InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory;
-    
     @Before
     public void setup() throws MailboxException {
-        
+        clientId = ClientId.of("#0");
         mailboxSessionMapperFactory = new 
InMemoryMailboxSessionMapperFactory();
         MockAuthenticator authenticator = new MockAuthenticator();
         authenticator.addUser(ROBERT.username, ROBERT.password);
@@ -111,22 +113,28 @@ public class GetMessagesMethodTest {
     public void processShouldThrowWhenNullRequest() {
         GetMessagesMethod<InMemoryId> testee = new 
GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory);
         GetMessagesRequest request = null;
-        assertThatThrownBy(() -> testee.process(request, 
mock(MailboxSession.class))).isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> testee.process(request, mock(ClientId.class), 
mock(MailboxSession.class))).isInstanceOf(NullPointerException.class);
     }
 
     @Test
     public void processShouldThrowWhenNullSession() {
         GetMessagesMethod<InMemoryId> testee = new 
GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory);
         MailboxSession mailboxSession = null;
-        assertThatThrownBy(() -> 
testee.process(mock(GetMessagesRequest.class), 
mailboxSession)).isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> 
testee.process(mock(GetMessagesRequest.class), mock(ClientId.class), 
mailboxSession)).isInstanceOf(NullPointerException.class);
+    }
+
+    @Test
+    public void processShouldThrowWhenNullClientId() {
+        GetMessagesMethod<InMemoryId> testee = new 
GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory);
+        ClientId clientId = null;
+        assertThatThrownBy(() -> 
testee.process(mock(GetMessagesRequest.class), clientId, 
mock(MailboxSession.class))).isInstanceOf(NullPointerException.class);
     }
-    
 
     @Test
     public void processShouldThrowWhenRequestHasAccountId() {
         GetMessagesMethod<InMemoryId> testee = new 
GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory);
         assertThatThrownBy(() -> testee.process(
-                GetMessagesRequest.builder().accountId("abc").build(), 
mock(MailboxSession.class))).isInstanceOf(NotImplementedException.class);
+                GetMessagesRequest.builder().accountId("abc").build(), 
mock(ClientId.class), 
mock(MailboxSession.class))).isInstanceOf(NotImplementedException.class);
     }
     
     @Test
@@ -147,9 +155,13 @@ public class GetMessagesMethodTest {
                 .build();
 
         GetMessagesMethod<InMemoryId> testee = new 
GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory);
-        GetMessagesResponse result = testee.process(request, session);
+        List<JmapResponse> result = testee.process(request, clientId, 
session).collect(Collectors.toList());
         
-        assertThat(result.list())
+        assertThat(result).hasSize(1)
+            .extracting(JmapResponse::getResponse)
+            .hasOnlyElementsOfType(GetMessagesResponse.class)
+            .extracting(GetMessagesResponse.class::cast)
+            .flatExtracting(GetMessagesResponse::list)
             .extracting(message -> message.getId().getUid(), 
Message::getSubject)
             .containsOnly(
                     Tuple.tuple(message1Uid, "message 1 subject"), 
@@ -170,11 +182,16 @@ public class GetMessagesMethodTest {
                 .build();
 
         GetMessagesMethod<InMemoryId> testee = new 
GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory);
-        GetMessagesResponse result = testee.process(request, session);
-        
-        assertThat(result.list())
+        List<JmapResponse> result = testee.process(request, clientId, 
session).collect(Collectors.toList());
+
+        assertThat(result).hasSize(1)
+            .extracting(JmapResponse::getResponse)
+            .hasOnlyElementsOfType(GetMessagesResponse.class)
+            .extracting(GetMessagesResponse.class::cast)
+            .flatExtracting(GetMessagesResponse::list)
             .extracting(message -> message.getId().getUid(), 
Message::getSubject)
-            .containsOnly(Tuple.tuple(message1Uid, "message 1 subject")); 
+            .containsOnly(
+                Tuple.tuple(message1Uid, "message 1 subject"));
     }
 
     @Test
@@ -190,11 +207,16 @@ public class GetMessagesMethodTest {
                 .build();
 
         GetMessagesMethod<InMemoryId> testee = new 
GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory);
-        GetMessagesResponse result = testee.process(request, session);
-        
-        assertThat(result.list())
+        List<JmapResponse> result = testee.process(request, clientId, 
session).collect(Collectors.toList());
+
+        assertThat(result).hasSize(1)
+            .extracting(JmapResponse::getResponse)
+            .hasOnlyElementsOfType(GetMessagesResponse.class)
+            .extracting(GetMessagesResponse.class::cast)
+            .flatExtracting(GetMessagesResponse::list)
             .extracting(message -> message.getId().getUid(), 
Message::getSubject)
-            .containsOnly(Tuple.tuple(message1Uid, "message 1 subject")); 
+            .containsOnly(
+                Tuple.tuple(message1Uid, "message 1 subject"));
     }
     
     @Test
@@ -209,11 +231,16 @@ public class GetMessagesMethodTest {
                 .build();
 
         GetMessagesMethod<InMemoryId> testee = new 
GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory);
-        GetMessagesResponse result = testee.process(request, session);
-        
-        assertThat(result.list())
+        List<JmapResponse> result = testee.process(request, clientId, 
session).collect(Collectors.toList());
+
+        assertThat(result).hasSize(1)
+            .extracting(JmapResponse::getResponse)
+            .hasOnlyElementsOfType(GetMessagesResponse.class)
+            .extracting(GetMessagesResponse.class::cast)
+            .flatExtracting(GetMessagesResponse::list)
             .extracting(message -> message.getId().getUid(), 
Message::getSubject)
-            .containsOnly(Tuple.tuple(message1Uid, "message 1 subject")); 
+            .containsOnly(
+                Tuple.tuple(message1Uid, "message 1 subject"));
     }
 
 }

Modified: 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java?rev=1724384&r1=1724383&r2=1724384&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java
 Wed Jan 13 10:11:53 2016
@@ -20,12 +20,19 @@
 package org.apache.james.jmap.methods;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.tuple;
+import static org.assertj.core.groups.Tuple.*;
 
 import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
+import com.google.common.collect.Iterables;
 import org.apache.james.jmap.model.ClientId;
 import org.apache.james.jmap.model.ProtocolRequest;
 import org.apache.james.jmap.model.ProtocolResponse;
+import org.assertj.core.groups.Tuple;
 import org.junit.Ignore;
 import org.junit.Test;
 
@@ -47,15 +54,16 @@ public class JmapResponseWriterImplTest
         String expectedId = "myId";
 
         JmapResponseWriterImpl jmapResponseWriterImpl = new 
JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module()));
-        ProtocolResponse response = 
jmapResponseWriterImpl.formatMethodResponse(JmapResponse
+        Stream<ProtocolResponse> response = 
jmapResponseWriterImpl.formatMethodResponse(Stream.of(JmapResponse
                 .builder()
                 .clientId(ClientId.of(expectedClientId))
                 .response(null)
-                .build());
+                .build()));
 
-        assertThat(response.getResponseName()).isEqualTo(expectedMethod);
-        
assertThat(response.getResults().findValue("id").asText()).isEqualTo(expectedId);
-        assertThat(response.getClientId()).isEqualTo(expectedClientId);
+        List<ProtocolResponse> responseList = 
response.collect(Collectors.toList());
+        assertThat(responseList).hasSize(1)
+                .extracting(ProtocolResponse::getResponseName, x -> 
x.getResults().get("id").asText(), ProtocolResponse::getClientId)
+                .containsExactly(tuple(expectedMethod, expectedId, 
expectedClientId));
     }
 
     @Test
@@ -67,17 +75,18 @@ public class JmapResponseWriterImplTest
         responseClass.id = expectedId;
 
         JmapResponseWriterImpl jmapResponseWriterImpl = new 
JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module()));
-        ProtocolResponse response = 
jmapResponseWriterImpl.formatMethodResponse(
-                JmapResponse
+        List<ProtocolResponse> response = 
jmapResponseWriterImpl.formatMethodResponse(
+                Stream.of(JmapResponse
                 .builder()
                 .responseName(Method.Response.name("unknownMethod"))
                 .clientId(ClientId.of(expectedClientId))
                 .response(responseClass)
-                .build());
+                .build()))
+                .collect(Collectors.toList());
 
-        
assertThat(response.getResponseName()).isEqualTo(Method.Response.name("unknownMethod"));
-        
assertThat(response.getResults().findValue("id").asText()).isEqualTo(expectedId);
-        
assertThat(response.getClientId()).isEqualTo(ClientId.of(expectedClientId));
+        assertThat(response).hasSize(1)
+                .extracting(ProtocolResponse::getResponseName, x -> 
x.getResults().get("id").asText(), ProtocolResponse::getClientId)
+                .containsExactly(tuple(Method.Response.name("unknownMethod"), 
expectedId, ClientId.of(expectedClientId)));
     }
 
     private static class ResponseClass implements Method.Response {
@@ -86,56 +95,94 @@ public class JmapResponseWriterImplTest
         public String id;
         
     }
-    
+
     @Test
     public void formatMethodResponseShouldFilterFieldsWhenProperties() {
         ObjectResponseClass responseClass = new ObjectResponseClass();
         responseClass.list = ImmutableList.of(new 
ObjectResponseClass.Foo("id", "name"));
 
         JmapResponseWriterImpl jmapResponseWriterImpl = new 
JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module()));
-        ProtocolResponse response = 
jmapResponseWriterImpl.formatMethodResponse(
-                JmapResponse
+        List<ProtocolResponse> response = 
jmapResponseWriterImpl.formatMethodResponse(
+                Stream.of(JmapResponse
                 .builder()
                 .responseName(Method.Response.name("unknownMethod"))
                 .clientId(ClientId.of("#1"))
                 .properties(ImmutableSet.of("id"))
                 .response(responseClass)
-                .build());
+                .build()))
+                .collect(Collectors.toList());
 
-        JsonNode firstObject = 
response.getResults().get("list").elements().next();
+        assertThat(response).hasSize(1);
+        JsonNode firstObject = 
Iterables.getOnlyElement(response).getResults().get("list").elements().next();
         assertThat(firstObject.get("id").asText()).isEqualTo("id");
         assertThat(firstObject.get("name")).isNull();
     }
 
-    
+
+
     @Test
     public void 
formatMethodResponseShouldNotFilterFieldsWhenSecondCallWithoutProperties() {
         ObjectResponseClass responseClass = new ObjectResponseClass();
         responseClass.list = ImmutableList.of(new 
ObjectResponseClass.Foo("id", "name"));
 
         JmapResponseWriterImpl jmapResponseWriterImpl = new 
JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module()));
-        jmapResponseWriterImpl.formatMethodResponse(
-                JmapResponse
-                .builder()
-                .responseName(Method.Response.name("unknownMethod"))
-                .clientId(ClientId.of("#1"))
-                .properties(ImmutableSet.of("id"))
-                .response(responseClass)
-                .build());
+        @SuppressWarnings("unused")
+        Stream<ProtocolResponse> ignoredResponse = 
jmapResponseWriterImpl.formatMethodResponse(
+                Stream.of(JmapResponse
+                        .builder()
+                        .responseName(Method.Response.name("unknownMethod"))
+                        .clientId(ClientId.of("#1"))
+                        .properties(ImmutableSet.of("id"))
+                        .response(responseClass)
+                        .build()));
 
-        ProtocolResponse response = 
jmapResponseWriterImpl.formatMethodResponse(
-                JmapResponse
+        List<ProtocolResponse> response = 
jmapResponseWriterImpl.formatMethodResponse(
+                Stream.of(JmapResponse
                 .builder()
                 .responseName(Method.Response.name("unknownMethod"))
                 .clientId(ClientId.of("#1"))
                 .response(responseClass)
-                .build());
+                .build()))
+                .collect(Collectors.toList());
 
-        JsonNode firstObject = 
response.getResults().get("list").elements().next();
+        assertThat(response).hasSize(1);
+        JsonNode firstObject = 
Iterables.getOnlyElement(response).getResults().get("list").elements().next();
         assertThat(firstObject.get("id").asText()).isEqualTo("id");
         assertThat(firstObject.get("name").asText()).isEqualTo("name");
     }
 
+    @Test
+    public void formatMethodResponseShouldFilterRightFieldsForEachResponse() {
+        ObjectResponseClass responseClass = new ObjectResponseClass();
+        responseClass.list = ImmutableList.of(new 
ObjectResponseClass.Foo("id", "name"));
+
+        JmapResponseWriterImpl jmapResponseWriterImpl = new 
JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module()));
+
+        List<ProtocolResponse> response = 
jmapResponseWriterImpl.formatMethodResponse(
+                Stream.of(JmapResponse
+                            .builder()
+                            
.responseName(Method.Response.name("unknownMethod"))
+                            .clientId(ClientId.of("#1"))
+                            .properties(ImmutableSet.of("id", "name"))
+                            .response(responseClass)
+                            .build(),
+                        JmapResponse
+                            .builder()
+                            
.responseName(Method.Response.name("unknownMethod"))
+                            .clientId(ClientId.of("#1"))
+                            .properties(ImmutableSet.of("id"))
+                            .response(responseClass)
+                            .build()))
+                .collect(Collectors.toList());
+
+        assertThat(response).hasSize(2)
+                .extracting(x -> x.getResults().get("list").elements().next())
+                .extracting(
+                        x -> x.get("id").asText(),
+                        x -> 
Optional.ofNullable(x.get("name")).map(JsonNode::asText).orElse(null))
+                .containsExactly(tuple("id", "name"), tuple("id", null));
+    }
+
     @SuppressWarnings("unused")
     private static class ObjectResponseClass implements Method.Response {
         @JsonFilter("propertiesFilter")
@@ -161,15 +208,17 @@ public class JmapResponseWriterImplTest
                 new ObjectNode(new 
JsonNodeFactory(false)).textNode(expectedClientId)} ;
 
         JmapResponseWriterImpl jmapResponseWriterImpl = new 
JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module()));
-        ProtocolResponse response = 
jmapResponseWriterImpl.formatMethodResponse(
-                JmapResponse
+        List<ProtocolResponse> response = 
jmapResponseWriterImpl.formatMethodResponse(
+                Stream.of(JmapResponse
                     .builder()
                     .clientId(ProtocolRequest.deserialize(nodes).getClientId())
                     .error()
-                    .build());
+                    .build()))
+                .collect(Collectors.toList());
 
-        
assertThat(response.getResponseName()).isEqualToComparingFieldByField(JmapResponse.ERROR_METHOD);
-        
assertThat(response.getResults().findValue("type").asText()).isEqualTo(JmapResponse.DEFAULT_ERROR_MESSAGE);
-        
assertThat(response.getClientId()).isEqualTo(ClientId.of(expectedClientId));
+        assertThat(response).hasSize(1)
+                .extracting(ProtocolResponse::getResponseName, x -> 
x.getResults().get("type").asText(), ProtocolResponse::getClientId)
+                .containsExactly(tuple(JmapResponse.ERROR_METHOD, 
JmapResponse.DEFAULT_ERROR_MESSAGE, ClientId.of(expectedClientId)));
     }
+
 }

Modified: 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java?rev=1724384&r1=1724383&r2=1724384&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java
 Wed Jan 13 10:11:53 2016
@@ -19,14 +19,15 @@
 
 package org.apache.james.jmap.methods;
 
+import static org.assertj.core.api.Assertions.tuple;
 import static org.mockito.Mockito.mock;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import javax.inject.Inject;
 import javax.servlet.http.HttpServletRequest;
 
-import org.apache.james.jmap.methods.Method.Response.Name;
 import org.apache.james.jmap.model.AuthenticatedProtocolRequest;
+import org.apache.james.jmap.model.ClientId;
 import org.apache.james.jmap.model.ProtocolRequest;
 import org.apache.james.jmap.model.ProtocolResponse;
 import org.apache.james.mailbox.MailboxSession;
@@ -41,6 +42,10 @@ import com.google.common.annotations.Vis
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 public class RequestHandlerTest {
 
     public static class TestJmapRequest implements JmapRequest {
@@ -94,20 +99,20 @@ public class RequestHandlerTest {
         }
 
         @Override
-        public Method.Response.Name responseName() {
-            return Method.Response.name("testMethod");
-        }
-        
-        @Override
         public Class<? extends JmapRequest> requestType() {
             return TestJmapRequest.class;
         }
 
         @Override
-        public TestJmapResponse process(JmapRequest request, MailboxSession 
mailboxSession) {
+        public Stream<JmapResponse> process(JmapRequest request, ClientId 
clientId, MailboxSession mailboxSession) {
             Preconditions.checkArgument(request instanceof TestJmapRequest);
             TestJmapRequest typedRequest = (TestJmapRequest) request;
-            return new TestJmapResponse(typedRequest.getId(), 
typedRequest.getName(), "works");
+            return Stream.of(
+                    JmapResponse.builder()
+                            .response(new 
TestJmapResponse(typedRequest.getId(), typedRequest.getName(), "works"))
+                            .responseName(Response.name("test"))
+                            .clientId(ClientId.of("#0"))
+                            .build());
         }
     }
 
@@ -180,17 +185,12 @@ public class RequestHandlerTest {
         }
         
         @Override
-        public Name responseName() {
-            return null;
-        }
-
-        @Override
         public Class<? extends JmapRequest> requestType() {
             return null;
         }
         
         @Override
-        public Method.Response process(JmapRequest request, MailboxSession 
mailboxSession) {
+        public Stream<JmapResponse> process(JmapRequest request, ClientId 
clientId, MailboxSession mailboxSession) {
             return null;
         }
     }
@@ -205,10 +205,14 @@ public class RequestHandlerTest {
                 parameters,
                 new ObjectNode(new JsonNodeFactory(false)).textNode("#1")} ;
 
-        ProtocolResponse response = 
testee.handle(AuthenticatedProtocolRequest.decorate(ProtocolRequest.deserialize(nodes),
 mockHttpServletRequest));
+        List<ProtocolResponse> responses = 
testee.handle(AuthenticatedProtocolRequest.decorate(ProtocolRequest.deserialize(nodes),
 mockHttpServletRequest))
+                .collect(Collectors.toList());
 
-        
assertThat(response.getResults().findValue("id").asText()).isEqualTo("testId");
-        
assertThat(response.getResults().findValue("name").asText()).isEqualTo("testName");
-        
assertThat(response.getResults().findValue("message").asText()).isEqualTo("works");
+        assertThat(responses).hasSize(1)
+                .extracting(
+                        x -> x.getResults().findValue("id").asText(),
+                        x -> x.getResults().findValue("name").asText(),
+                        x -> x.getResults().findValue("message").asText())
+                .containsExactly(tuple("testId", "testName", "works"));
     }
 }



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

Reply via email to