Author: matthieu
Date: Fri Dec 11 12:30:56 2015
New Revision: 1719370
URL: http://svn.apache.org/viewvc?rev=1719370&view=rev
Log:
JAMES-1644 do the json parsing into RequestHandler
That way, generic error conditions are handled in a common place
and the Method implementation can be easily tested as it takes
business objects that are easy to build
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/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/main/java/org/apache/james/jmap/model/GetMailboxesRequest.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/JmapRequestParserImplTest.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=1719370&r1=1719369&r2=1719370&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
Fri Dec 11 12:30:56 2015
@@ -32,10 +32,8 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang.NotImplementedException;
import org.apache.james.jmap.methods.RequestHandler;
import org.apache.james.jmap.model.AuthenticatedProtocolRequest;
-import org.apache.james.jmap.model.GetMailboxesRequest;
import org.apache.james.jmap.model.ProtocolRequest;
import org.apache.james.jmap.model.ProtocolResponse;
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=1719370&r1=1719369&r2=1719370&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
Fri Dec 11 12:30:56 2015
@@ -19,18 +19,13 @@
package org.apache.james.jmap.methods;
-import java.io.IOException;
import java.util.Optional;
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.GetMailboxesRequest;
import org.apache.james.jmap.model.GetMailboxesResponse;
import org.apache.james.jmap.model.Mailbox;
-import org.apache.james.jmap.model.ProtocolResponse;
import org.apache.james.jmap.model.Role;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
@@ -44,45 +39,35 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
public class GetMailboxesMethod<Id extends MailboxId> implements Method {
private static final boolean DONT_RESET_RECENT = false;
private static final Logger LOGGER =
LoggerFactory.getLogger(GetMailboxesMethod.class);
- private final JmapRequestParser jmapRequestParser;
- private final JmapResponseWriter jmapResponseWriter;
private final MailboxManager mailboxManager;
private final MailboxMapperFactory<Id> mailboxMapperFactory;
@Inject
- @VisibleForTesting public GetMailboxesMethod(JmapRequestParser
jmapRequestParser, JmapResponseWriter jmapResponseWriter,
- MailboxManager mailboxManager, MailboxMapperFactory<Id>
mailboxMapperFactory) {
-
- this.jmapRequestParser = jmapRequestParser;
- this.jmapResponseWriter = jmapResponseWriter;
+ @VisibleForTesting public GetMailboxesMethod(MailboxManager
mailboxManager, MailboxMapperFactory<Id> mailboxMapperFactory) {
this.mailboxManager = mailboxManager;
this.mailboxMapperFactory = mailboxMapperFactory;
}
+ @Override
public String methodName() {
return "getMailboxes";
}
- public JmapResponse process(AuthenticatedProtocolRequest request) {
- Builder responseBuilder = JmapResponse.forRequest(request);
- try {
- jmapRequestParser.extractJmapRequest(request,
GetMailboxesRequest.class);
- } catch (IOException e) {
- if (e.getCause() instanceof NotImplementedException) {
- return responseBuilder.error("Not yet implemented").build();
- } else {
- return responseBuilder.error("invalidArguments").build();
- }
- }
-
+ @Override
+ public Class<? extends JmapRequest> requestType() {
+ return GetMailboxesRequest.class;
+ }
+
+ public JmapResponse process(JmapRequest request, MailboxSession
mailboxSession, JmapResponse.Builder responseBuilder) {
+ Preconditions.checkArgument(request instanceof GetMailboxesRequest);
try {
- MailboxSession mailboxSession = request.getMailboxSession();
responseBuilder.response(getMailboxesResponse(mailboxSession));
return responseBuilder.build();
} catch (MailboxException e) {
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=1719370&r1=1719369&r2=1719370&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
Fri Dec 11 12:30:56 2015
@@ -19,12 +19,14 @@
package org.apache.james.jmap.methods;
-import org.apache.james.jmap.model.AuthenticatedProtocolRequest;
+import org.apache.james.mailbox.MailboxSession;
public interface Method {
String methodName();
- JmapResponse process(AuthenticatedProtocolRequest request);
+ Class<? extends JmapRequest> requestType();
+
+ JmapResponse process(JmapRequest request, MailboxSession mailboxSession,
JmapResponse.Builder responseBuilder);
}
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=1719370&r1=1719369&r2=1719370&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
Fri Dec 11 12:30:56 2015
@@ -19,33 +19,56 @@
package org.apache.james.jmap.methods;
+import java.io.IOException;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
+import java.util.function.Function;
import java.util.stream.Collectors;
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;
public class RequestHandler {
- private final Map<String, Method> methods;
+ private final JmapRequestParser jmapRequestParser;
private final JmapResponseWriter jmapResponseWriter;
+ private final Map<String, Method> methods;
@Inject
- public RequestHandler(Set<Method> methods, JmapResponseWriter
jmapResponseWriter) {
+ public RequestHandler(Set<Method> methods, JmapRequestParser
jmapRequestParser, JmapResponseWriter jmapResponseWriter) {
+ this.jmapRequestParser = jmapRequestParser;
this.jmapResponseWriter = jmapResponseWriter;
this.methods = methods.stream()
.collect(Collectors.toMap(Method::methodName, method ->
method));
}
public ProtocolResponse handle(AuthenticatedProtocolRequest request) {
+ Builder responseBuilder = JmapResponse.forRequest(request);
return Optional.ofNullable(methods.get(request.getMethod()))
- .map(method -> method.process(request))
- .map(jmapResponseWriter::formatMethodResponse)
- .orElseThrow(() -> new IllegalStateException("unknown
method"));
+ .map(extractAndProcess(request, responseBuilder))
+ .map(jmapResponseWriter::formatMethodResponse)
+ .orElseThrow(() -> new IllegalStateException("unknown
method"));
}
+ private Function<Method, JmapResponse>
extractAndProcess(AuthenticatedProtocolRequest request, JmapResponse.Builder
responseBuilder) {
+ MailboxSession mailboxSession = request.getMailboxSession();
+ return (Method method) -> {
+ try {
+ JmapRequest jmapRequest =
jmapRequestParser.extractJmapRequest(request, method.requestType());
+ return method.process(jmapRequest, mailboxSession,
responseBuilder);
+ } catch (IOException e) {
+ if (e.getCause() instanceof NotImplementedException) {
+ return responseBuilder.error("Not yet
implemented").build();
+ }
+ return
responseBuilder.error("invalidArguments").build();
+ }
+ };
+
+ }
}
Modified:
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/GetMailboxesRequest.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/GetMailboxesRequest.java?rev=1719370&r1=1719369&r2=1719370&view=diff
==============================================================================
---
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/GetMailboxesRequest.java
(original)
+++
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/GetMailboxesRequest.java
Fri Dec 11 12:30:56 2015
@@ -67,7 +67,7 @@ public class GetMailboxesRequest impleme
}
return this;
}
-
+
public GetMailboxesRequest build() {
return new GetMailboxesRequest(Optional.ofNullable(accountId),
ids.build(), properties.build());
}
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=1719370&r1=1719369&r2=1719370&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
Fri Dec 11 12:30:56 2015
@@ -85,8 +85,8 @@ public class GetMailboxesMethodTest {
JmapRequestParser jmapRequestParser = new
JmapRequestParserImpl(ImmutableSet.of(new Jdk8Module()));
JmapResponseWriter jmapResponseWriter = new
JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module()));
- GetMailboxesMethod<TestId> getMailboxMethod = new
GetMailboxesMethod<>(jmapRequestParser, jmapResponseWriter,
mockedMailboxManager, mockedMailboxMapperFactory);
- requestHandler = new RequestHandler(ImmutableSet.of(getMailboxMethod),
jmapResponseWriter);
+ GetMailboxesMethod<TestId> getMailboxMethod = new
GetMailboxesMethod<>(mockedMailboxManager, mockedMailboxMapperFactory);
+ requestHandler = new RequestHandler(ImmutableSet.of(getMailboxMethod),
jmapRequestParser, jmapResponseWriter);
JMAPServlet jmapServlet = new JMAPServlet(requestHandler);
AuthenticationFilter authenticationFilter = new
AuthenticationFilter(mockedAccessTokenManager, mockedMailboxManager);
Modified:
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapRequestParserImplTest.java
URL:
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapRequestParserImplTest.java?rev=1719370&r1=1719369&r2=1719370&view=diff
==============================================================================
---
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapRequestParserImplTest.java
(original)
+++
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapRequestParserImplTest.java
Fri Dec 11 12:30:56 2015
@@ -68,5 +68,6 @@ public class JmapRequestParserImplTest {
@SuppressWarnings("unused")
public String parameter;
+
}
}
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=1719370&r1=1719369&r2=1719370&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
Fri Dec 11 12:30:56 2015
@@ -19,10 +19,9 @@
package org.apache.james.jmap.methods;
+import static org.mockito.Mockito.mock;
import static org.assertj.core.api.Assertions.assertThat;
-import java.io.IOException;
-
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
@@ -30,6 +29,7 @@ import org.apache.james.jmap.methods.Jma
import org.apache.james.jmap.model.AuthenticatedProtocolRequest;
import org.apache.james.jmap.model.ProtocolRequest;
import org.apache.james.jmap.model.ProtocolResponse;
+import org.apache.james.mailbox.MailboxSession;
import org.junit.Before;
import org.junit.Test;
@@ -38,6 +38,7 @@ import com.fasterxml.jackson.databind.no
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
public class RequestHandlerTest {
@@ -83,11 +84,8 @@ public class RequestHandlerTest {
public static class TestMethod implements Method {
- private final JmapRequestParser jmapRequestParser;
-
@Inject
- @VisibleForTesting TestMethod(JmapRequestParser jmapRequestParser,
JmapResponseWriter jmapResponseWriter) {
- this.jmapRequestParser = jmapRequestParser;
+ @VisibleForTesting TestMethod() {
}
@Override
@@ -96,30 +94,31 @@ public class RequestHandlerTest {
}
@Override
- public JmapResponse process(AuthenticatedProtocolRequest request) {
- Builder response = JmapResponse.forRequest(request);
- try {
- TestJmapRequest typedRequest =
jmapRequestParser.extractJmapRequest(request, TestJmapRequest.class);
- return response
- .response(new
TestJmapResponse(typedRequest.getId(), typedRequest.getName(), "works"))
- .build();
- } catch (IOException e) {
- return response.error().build();
- }
+ public Class<? extends JmapRequest> requestType() {
+ return TestJmapRequest.class;
+ }
+
+ @Override
+ public JmapResponse process(JmapRequest request, MailboxSession
mailboxSession, Builder responseBuilder) {
+ Preconditions.checkArgument(request instanceof TestJmapRequest);
+ TestJmapRequest typedRequest = (TestJmapRequest) request;
+ return responseBuilder
+ .response(new TestJmapResponse(typedRequest.getId(),
typedRequest.getName(), "works"))
+ .build();
}
}
private RequestHandler testee;
private JmapRequestParser jmapRequestParser;
private JmapResponseWriter jmapResponseWriter;
- private HttpServletRequest fakeHttpServletRequest;
+ private HttpServletRequest mockHttpServletRequest;
@Before
public void setup() {
jmapRequestParser = new JmapRequestParserImpl(ImmutableSet.of(new
Jdk8Module()));
jmapResponseWriter = new JmapResponseWriterImpl(ImmutableSet.of(new
Jdk8Module()));
- fakeHttpServletRequest = null;
- testee = new RequestHandler(ImmutableSet.of(new
TestMethod(jmapRequestParser, jmapResponseWriter)), jmapResponseWriter);
+ mockHttpServletRequest = mock(HttpServletRequest.class);
+ testee = new RequestHandler(ImmutableSet.of(new TestMethod()),
jmapRequestParser, jmapResponseWriter);
}
@@ -129,16 +128,17 @@ public class RequestHandlerTest {
new ObjectNode(new JsonNodeFactory(false)).putObject("{\"id\":
\"id\"}"),
new ObjectNode(new JsonNodeFactory(false)).textNode("#1")} ;
- RequestHandler requestHandler = new RequestHandler(ImmutableSet.of(),
jmapResponseWriter);
-
requestHandler.handle(AuthenticatedProtocolRequest.decorate(ProtocolRequest.deserialize(nodes),
fakeHttpServletRequest));
+ RequestHandler requestHandler = new RequestHandler(ImmutableSet.of(),
jmapRequestParser, jmapResponseWriter);
+
requestHandler.handle(AuthenticatedProtocolRequest.decorate(ProtocolRequest.deserialize(nodes),
mockHttpServletRequest));
}
@Test(expected=IllegalStateException.class)
public void requestHandlerShouldThrowWhenAMethodIsRecordedTwice() {
new RequestHandler(
ImmutableSet.of(
- new TestMethod(jmapRequestParser, jmapResponseWriter),
- new TestMethod(jmapRequestParser, jmapResponseWriter)),
+ new TestMethod(),
+ new TestMethod()),
+ jmapRequestParser,
jmapResponseWriter);
}
@@ -148,6 +148,7 @@ public class RequestHandlerTest {
ImmutableSet.of(
new NamedMethod("name"),
new NamedMethod("name")),
+ jmapRequestParser,
jmapResponseWriter);
}
@@ -157,6 +158,7 @@ public class RequestHandlerTest {
ImmutableSet.of(
new NamedMethod("name"),
new NamedMethod("name2")),
+ jmapRequestParser,
jmapResponseWriter);
}
@@ -175,7 +177,12 @@ public class RequestHandlerTest {
}
@Override
- public JmapResponse process(AuthenticatedProtocolRequest request) {
+ public Class<? extends JmapRequest> requestType() {
+ return null;
+ }
+
+ @Override
+ public JmapResponse process(JmapRequest request, MailboxSession
mailboxSession, Builder responseBuilder) {
return null;
}
}
@@ -190,7 +197,7 @@ public class RequestHandlerTest {
parameters,
new ObjectNode(new JsonNodeFactory(false)).textNode("#1")} ;
- ProtocolResponse response =
testee.handle(AuthenticatedProtocolRequest.decorate(ProtocolRequest.deserialize(nodes),
fakeHttpServletRequest));
+ ProtocolResponse response =
testee.handle(AuthenticatedProtocolRequest.decorate(ProtocolRequest.deserialize(nodes),
mockHttpServletRequest));
assertThat(response.getResults().findValue("id").asText()).isEqualTo("testId");
assertThat(response.getResults().findValue("name").asText()).isEqualTo("testName");
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]