You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2017/08/24 03:46:29 UTC

[04/38] james-project git commit: JAMES-2114 MDC contectual logging for JMAP

JAMES-2114 MDC contectual logging for JMAP


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/176d7bf5
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/176d7bf5
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/176d7bf5

Branch: refs/heads/master
Commit: 176d7bf5982aa348e46a363a7fee41055a2f8bb0
Parents: 47ceea4
Author: benwa <bt...@linagora.com>
Authored: Wed Aug 23 16:21:04 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Thu Aug 24 10:34:38 2017 +0700

----------------------------------------------------------------------
 .../java/org/apache/james/jmap/JMAPServer.java  |  4 ++
 .../java/org/apache/james/jmap/JMAPServlet.java | 23 +++++---
 .../java/org/apache/james/jmap/MDCFilter.java   | 56 ++++++++++++++++++++
 .../james/jmap/methods/GetMailboxesMethod.java  | 13 ++++-
 .../jmap/methods/GetMessageListMethod.java      | 20 ++++++-
 .../james/jmap/methods/GetMessagesMethod.java   | 13 ++++-
 .../jmap/methods/GetVacationResponseMethod.java | 11 +++-
 .../james/jmap/methods/RequestHandler.java      | 20 +++++--
 .../james/jmap/methods/SetMailboxesMethod.java  | 16 +++++-
 .../james/jmap/methods/SetMessagesMethod.java   | 18 ++++++-
 .../jmap/methods/SetVacationResponseMethod.java | 12 ++++-
 .../apache/james/jmap/methods/ValueWithId.java  |  9 ++++
 .../james/jmap/model/CreationMessage.java       |  7 +++
 .../james/jmap/model/CreationMessageId.java     |  8 +++
 .../james/jmap/model/MailboxCreationId.java     |  8 +++
 .../james/jmap/model/MailboxProperty.java       |  8 +++
 .../james/jmap/model/MessageProperties.java     |  9 ++++
 .../james/jmap/model/VacationResponse.java      | 11 ++++
 .../org/apache/james/jmap/JMAPServletTest.java  |  4 +-
 .../james/jmap/methods/RequestHandlerTest.java  |  4 +-
 20 files changed, 249 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServer.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServer.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServer.java
index 5d7ad49..2881e68 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServer.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServer.java
@@ -58,6 +58,7 @@ public class JMAPServer implements Configurable {
                         .with(authenticationServlet)
                     .filter(JMAPUrls.AUTHENTICATION)
                         .with(new AllowAllCrossOriginRequests(bypass(authenticationFilter).on("POST").and("OPTIONS").only()))
+                        .and(new MDCFilter())
                         .only()
                     .serve(JMAPUrls.JMAP)
                         .with(jmapServlet)
@@ -66,16 +67,19 @@ public class JMAPServer implements Configurable {
                         .and(new LogbookFilter(logbook()))
                         .and(userProvisioningFilter)
                         .and(defaultMailboxesProvisioningFilter)
+                        .and(new MDCFilter())
                         .only()
                     .serveAsOneLevelTemplate(JMAPUrls.DOWNLOAD)
                         .with(downloadServlet)
                     .filterAsOneLevelTemplate(JMAPUrls.DOWNLOAD)
                         .with(new AllowAllCrossOriginRequests(bypass(authenticationFilter).on("OPTIONS").only()))
+                        .and(new MDCFilter())
                         .only()
                     .serve(JMAPUrls.UPLOAD)
                         .with(uploadServlet)
                     .filterAsOneLevelTemplate(JMAPUrls.UPLOAD)
                         .with(new AllowAllCrossOriginRequests(bypass(authenticationFilter).on("OPTIONS").only()))
+                        .and(new MDCFilter())
                         .only()
                     .build()));
         } else {

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java
index 2b17bd8..8ace83e 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java
@@ -45,6 +45,7 @@ import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.Throwables;
 
 public class JMAPServlet extends HttpServlet {
 
@@ -67,13 +68,13 @@ public class JMAPServlet extends HttpServlet {
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException {
         TimeMetric timeMetric = metricFactory.timer("JMAP-request");
         try {
-            List<Object[]> responses = 
+            List<Object[]> responses =
                 requestAsJsonStream(req)
-                .map(ProtocolRequest::deserialize)
-                .map(x -> AuthenticatedProtocolRequest.decorate(x, req))
-                .flatMap(requestHandler::handle)
-                .map(ProtocolResponse::asProtocolSpecification)
-                .collect(Collectors.toList());
+                    .map(ProtocolRequest::deserialize)
+                    .map(x -> AuthenticatedProtocolRequest.decorate(x, req))
+                    .flatMap(this::handle)
+                    .map(ProtocolResponse::asProtocolSpecification)
+                    .collect(Collectors.toList());
 
             resp.setContentType(JSON_CONTENT_TYPE);
             objectMapper.writeValue(resp.getOutputStream(), responses);
@@ -87,7 +88,15 @@ public class JMAPServlet extends HttpServlet {
             timeMetric.stopAndPublish();
         }
     }
-    
+
+    private Stream<? extends ProtocolResponse> handle(AuthenticatedProtocolRequest request) {
+        try {
+            return requestHandler.handle(request);
+        } catch (IOException e) {
+            throw Throwables.propagate(e);
+        }
+    }
+
     private Stream<JsonNode[]> requestAsJsonStream(HttpServletRequest req) throws IOException, JsonParseException, JsonMappingException {
         return Arrays.stream(
                 objectMapper.readValue(req.getInputStream(), JsonNode[][].class));

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/MDCFilter.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/MDCFilter.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/MDCFilter.java
new file mode 100644
index 0000000..18b45c4
--- /dev/null
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/MDCFilter.java
@@ -0,0 +1,56 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.jmap;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import org.apache.james.util.MDCBuilder;
+
+public class MDCFilter implements Filter {
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+        try (Closeable closeable =
+                 MDCBuilder.create()
+                     .addContext(MDCBuilder.PROTOCOL, "JMAP")
+                     .addContext(MDCBuilder.IP, request.getRemoteAddr())
+                     .addContext(MDCBuilder.HOST, request.getRemoteHost())
+                     .build()) {
+            chain.doFilter(request, response);
+        }
+    }
+
+    @Override
+    public void destroy() {
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
index a32757e..b15a17e 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.jmap.methods;
 
+import java.io.Closeable;
+import java.io.IOException;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Optional;
@@ -41,6 +43,7 @@ import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxQuery;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.metrics.api.TimeMetric;
+import org.apache.james.util.MDCBuilder;
 import org.apache.james.util.OptionalConverter;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -80,13 +83,21 @@ public class GetMailboxesMethod implements Method {
         Preconditions.checkArgument(request instanceof GetMailboxesRequest);
         GetMailboxesRequest mailboxesRequest = (GetMailboxesRequest) request;
         TimeMetric timeMetric = metricFactory.timer(JMAP_PREFIX + METHOD_NAME.getName());
-        try {
+        try (Closeable closeable =
+                 MDCBuilder.create()
+                     .addContext(MDCBuilder.ACTION, "GET_MAILBOXES")
+                     .addContext("accountId", mailboxesRequest.getAccountId())
+                     .addContext("mailboxIds", mailboxesRequest.getIds())
+                     .addContext("properties", mailboxesRequest.getProperties())
+                     .build()) {
             return Stream.of(
                     JmapResponse.builder().clientId(clientId)
                     .response(getMailboxesResponse(mailboxesRequest, mailboxSession))
                     .properties(mailboxesRequest.getProperties().map(this::ensureContainsId))
                     .responseName(RESPONSE_NAME)
                     .build());
+        } catch (IOException e) {
+            throw Throwables.propagate(e);
         } finally {
             timeMetric.stopAndPublish();
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
index 24fbe46..a128fcc 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.jmap.methods;
 
+import java.io.Closeable;
+import java.io.IOException;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
@@ -45,6 +47,7 @@ import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.metrics.api.TimeMetric;
+import org.apache.james.util.MDCBuilder;
 
 import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
@@ -94,13 +97,28 @@ public class GetMessageListMethod implements Method {
         
         GetMessageListRequest messageListRequest = (GetMessageListRequest) request;
         GetMessageListResponse messageListResponse = getMessageListResponse(messageListRequest, mailboxSession);
-        try {
+        try (Closeable closeable =
+                 MDCBuilder.create()
+                     .addContext(MDCBuilder.ACTION, "GET_MESSAGE_LIST")
+                     .addContext("accountId", messageListRequest.getAccountId())
+                     .addContext("limit", messageListRequest.getLimit())
+                     .addContext("anchor", messageListRequest.getAnchor())
+                     .addContext("offset", messageListRequest.getAnchorOffset())
+                     .addContext("properties", messageListRequest.getFetchMessageProperties())
+                     .addContext("position", messageListRequest.getPosition())
+                     .addContext("filters", messageListRequest.getFilter())
+                     .addContext("sorts", messageListRequest.getSort())
+                     .addContext("isFetchMessage", messageListRequest.isFetchMessages())
+                     .addContext("isCollapseThread", messageListRequest.isCollapseThreads())
+                     .build()) {
             Stream<JmapResponse> jmapResponse = Stream.of(JmapResponse.builder().clientId(clientId)
                     .response(messageListResponse)
                     .responseName(RESPONSE_NAME)
                     .build());
             return Stream.concat(jmapResponse,
                     processGetMessages(messageListRequest, messageListResponse, clientId, mailboxSession));
+        } catch (IOException e) {
+            throw Throwables.propagate(e);
         } finally {
             timeMetric.stopAndPublish();
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
index acaf9cc..aa4a439 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.jmap.methods;
 
+import java.io.Closeable;
+import java.io.IOException;
 import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
@@ -45,6 +47,7 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.metrics.api.TimeMetric;
+import org.apache.james.util.MDCBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -95,13 +98,21 @@ public class GetMessagesMethod implements Method {
         GetMessagesRequest getMessagesRequest = (GetMessagesRequest) request;
         MessageProperties outputProperties = getMessagesRequest.getProperties().toOutputProperties();
         TimeMetric timeMetric = metricFactory.timer(JMAP_PREFIX + METHOD_NAME.getName());
-        try {
+        try (Closeable closeable =
+                 MDCBuilder.create()
+                     .addContext(MDCBuilder.ACTION, "GET_MESSAGES")
+                     .addContext("accountId", getMessagesRequest.getAccountId())
+                     .addContext("ids", getMessagesRequest.getIds())
+                     .addContext("properties", getMessagesRequest.getProperties())
+                     .build()) {
             return Stream.of(JmapResponse.builder().clientId(clientId)
                             .response(getMessagesResponse(mailboxSession, getMessagesRequest))
                             .responseName(RESPONSE_NAME)
                             .properties(outputProperties.getOptionalMessageProperties())
                             .filterProvider(buildOptionalHeadersFilteringFilterProvider(outputProperties))
                             .build());
+        } catch (IOException e) {
+            throw Throwables.propagate(e);
         } finally {
             timeMetric.stopAndPublish();
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetVacationResponseMethod.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetVacationResponseMethod.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetVacationResponseMethod.java
index abd4541..6653976 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetVacationResponseMethod.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetVacationResponseMethod.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.jmap.methods;
 
+import java.io.Closeable;
+import java.io.IOException;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
@@ -33,9 +35,11 @@ import org.apache.james.jmap.model.VacationResponse;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.metrics.api.TimeMetric;
+import org.apache.james.util.MDCBuilder;
 import org.apache.james.util.date.ZonedDateTimeProvider;
 
 import com.google.common.base.Preconditions;
+import com.google.common.base.Throwables;
 
 public class GetVacationResponseMethod implements Method {
 
@@ -71,12 +75,17 @@ public class GetVacationResponseMethod implements Method {
         Preconditions.checkArgument(request instanceof GetVacationRequest);
 
         TimeMetric timeMetric = metricFactory.timer(JMAP_PREFIX + METHOD_NAME.getName());
-        try {
+        try (Closeable closeable =
+                 MDCBuilder.create()
+                     .addContext(MDCBuilder.ACTION, "VACATION")
+                     .build()) {
             return Stream.of(JmapResponse.builder()
                 .clientId(clientId)
                 .responseName(RESPONSE_NAME)
                 .response(process(mailboxSession))
                 .build());
+        } catch (IOException e) {
+            throw Throwables.propagate(e);
         } finally {
             timeMetric.stopAndPublish();
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java
index 19a8633..f62273c 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.jmap.methods;
 
+import java.io.Closeable;
 import java.io.IOException;
 import java.util.Map;
 import java.util.Optional;
@@ -33,6 +34,7 @@ import org.apache.commons.lang.NotImplementedException;
 import org.apache.james.jmap.model.AuthenticatedProtocolRequest;
 import org.apache.james.jmap.model.ProtocolResponse;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.util.MDCBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,11 +54,19 @@ public class RequestHandler {
                 .collect(Collectors.toMap(Method::requestHandled, Function.identity()));
     }
 
-    public Stream<ProtocolResponse> handle(AuthenticatedProtocolRequest request) {
-        return Optional.ofNullable(methods.get(request.getMethodName()))
-                        .map(extractAndProcess(request))
-                        .map(jmapResponseWriter::formatMethodResponse)
-                        .orElseThrow(() -> new IllegalStateException("unknown method " + request.getMethodName()));
+    public Stream<ProtocolResponse> handle(AuthenticatedProtocolRequest request) throws IOException {
+        Optional<MailboxSession> mailboxSession = Optional.ofNullable(request.getMailboxSession());
+        try (Closeable closeable =
+                 MDCBuilder.create()
+                     .addContext(MDCBuilder.USER, mailboxSession.map(MailboxSession::getUser).map(MailboxSession.User::getUserName))
+                     .addContext(MDCBuilder.SESSION_ID, mailboxSession.map(MailboxSession::getSessionId))
+                     .addContext(MDCBuilder.ACTION, request.getMethodName().getName())
+                     .build()) {
+            return Optional.ofNullable(methods.get(request.getMethodName()))
+                .map(extractAndProcess(request))
+                .map(jmapResponseWriter::formatMethodResponse)
+                .orElseThrow(() -> new IllegalStateException("unknown method " + request.getMethodName()));
+        }
     }
     
     private Function<Method, Stream<JmapResponse>> extractAndProcess(AuthenticatedProtocolRequest request) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesMethod.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesMethod.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesMethod.java
index ba125b2..f73f788 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesMethod.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMailboxesMethod.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.jmap.methods;
 
+import java.io.Closeable;
+import java.io.IOException;
 import java.util.Set;
 import java.util.stream.Stream;
 
@@ -30,9 +32,11 @@ import org.apache.james.jmap.model.SetMailboxesResponse;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.metrics.api.TimeMetric;
+import org.apache.james.util.MDCBuilder;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
+import com.google.common.base.Throwables;
 
 public class SetMailboxesMethod implements Method {
 
@@ -66,13 +70,21 @@ public class SetMailboxesMethod implements Method {
         Preconditions.checkArgument(request instanceof SetMailboxesRequest);
         
         TimeMetric timeMetric = metricFactory.timer(JMAP_PREFIX + METHOD_NAME.getName());
-        try {
-            SetMailboxesRequest setMailboxesRequest = (SetMailboxesRequest) request;
+        SetMailboxesRequest setMailboxesRequest = (SetMailboxesRequest) request;
+        try (Closeable closeable =
+                 MDCBuilder.create()
+                     .addContext(MDCBuilder.ACTION, "SET_MAILBOXES")
+                     .addContext("create", setMailboxesRequest.getCreate())
+                     .addContext("update", setMailboxesRequest.getUpdate())
+                     .addContext("destroy", setMailboxesRequest.getDestroy())
+                     .build()) {
             return Stream.of(
                     JmapResponse.builder().clientId(clientId)
                     .response(setMailboxesResponse(setMailboxesRequest, mailboxSession))
                     .responseName(RESPONSE_NAME)
                     .build());
+        } catch (IOException e) {
+            throw Throwables.propagate(e);
         } finally {
             timeMetric.stopAndPublish();
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesMethod.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesMethod.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesMethod.java
index 8f9da9b..def3929 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesMethod.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesMethod.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.jmap.methods;
 
+import java.io.Closeable;
+import java.io.IOException;
 import java.util.Set;
 import java.util.stream.Stream;
 
@@ -30,9 +32,11 @@ import org.apache.james.jmap.model.SetMessagesResponse;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.metrics.api.TimeMetric;
+import org.apache.james.util.MDCBuilder;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
+import com.google.common.base.Throwables;
 
 public class SetMessagesMethod implements Method {
 
@@ -61,13 +65,23 @@ public class SetMessagesMethod implements Method {
     public Stream<JmapResponse> process(JmapRequest request, ClientId clientId, MailboxSession mailboxSession) {
         Preconditions.checkArgument(request instanceof SetMessagesRequest);
         TimeMetric timeMetric = metricFactory.timer(JMAP_PREFIX + METHOD_NAME.getName());
-        try {
+        SetMessagesRequest setMessagesRequest = (SetMessagesRequest) request;
+        try (Closeable closeable =
+                 MDCBuilder.create()
+                     .addContext(MDCBuilder.ACTION, "SET_MESSAGES")
+                     .addContext("accountId", setMessagesRequest.getAccountId())
+                     .addContext("create", setMessagesRequest.getCreate())
+                     .addContext("destroy", setMessagesRequest.getDestroy())
+                     .addContext("ifInState", setMessagesRequest.getIfInState())
+                     .build()) {
             Stream<JmapResponse> responses = Stream.of(
                     JmapResponse.builder().clientId(clientId)
-                    .response(setMessagesResponse((SetMessagesRequest) request, mailboxSession))
+                    .response(setMessagesResponse(setMessagesRequest, mailboxSession))
                     .responseName(RESPONSE_NAME)
                     .build());
             return responses;
+        } catch (IOException e) {
+            throw Throwables.propagate(e);
         } finally {
             timeMetric.stopAndPublish();
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetVacationResponseMethod.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetVacationResponseMethod.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetVacationResponseMethod.java
index 208cb2d..ffe30e9 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetVacationResponseMethod.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetVacationResponseMethod.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.jmap.methods;
 
+import java.io.Closeable;
+import java.io.IOException;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
@@ -35,8 +37,10 @@ import org.apache.james.jmap.model.VacationResponse;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.metrics.api.TimeMetric;
+import org.apache.james.util.MDCBuilder;
 
 import com.google.common.base.Preconditions;
+import com.google.common.base.Throwables;
 
 public class SetVacationResponseMethod implements Method {
 
@@ -77,7 +81,11 @@ public class SetVacationResponseMethod implements Method {
         SetVacationRequest setVacationRequest = (SetVacationRequest) request;
 
         TimeMetric timeMetric = metricFactory.timer(JMAP_PREFIX + METHOD_NAME.getName());
-        try {
+        try (Closeable closeable =
+                 MDCBuilder.create()
+                     .addContext(MDCBuilder.ACTION, "SET_VACATION")
+                     .addContext("update", setVacationRequest.getUpdate())
+                     .build()) {
             if (!setVacationRequest.isValid()) {
                 return Stream.of(JmapResponse
                     .builder()
@@ -92,6 +100,8 @@ public class SetVacationResponseMethod implements Method {
             return process(clientId,
                 AccountId.fromString(mailboxSession.getUser().getUserName()),
                 setVacationRequest.getUpdate().get(Vacation.ID));
+        } catch (IOException e) {
+            throw Throwables.propagate(e);
         } finally {
             timeMetric.stopAndPublish();
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/ValueWithId.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/ValueWithId.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/ValueWithId.java
index 9595ed3..194e6d1 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/ValueWithId.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/ValueWithId.java
@@ -24,6 +24,8 @@ import org.apache.james.jmap.model.CreationMessageId;
 import org.apache.james.jmap.model.Message;
 import org.apache.james.jmap.model.SetError;
 
+import com.google.common.base.MoreObjects;
+
 public class ValueWithId<T> {
 
     private CreationMessageId creationId;
@@ -60,4 +62,11 @@ public class ValueWithId<T> {
         }
     }
 
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+            .add("creationId", creationId)
+            .add("value", value)
+            .toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
index a113f83..791b383 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
@@ -476,4 +476,11 @@ public class CreationMessage {
             return result;
         }
     }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+            .add("mailboxIds", mailboxIds)
+            .toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessageId.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessageId.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessageId.java
index e23dd6a..a914ec1 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessageId.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessageId.java
@@ -22,6 +22,7 @@ package org.apache.james.jmap.model;
 import java.util.Objects;
 
 import com.fasterxml.jackson.annotation.JsonValue;
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 
 public class CreationMessageId {
@@ -56,4 +57,11 @@ public class CreationMessageId {
     public int hashCode() {
         return Objects.hash(id);
     }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+            .add("id", id)
+            .toString();
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxCreationId.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxCreationId.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxCreationId.java
index 40d76af..01398ac 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxCreationId.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxCreationId.java
@@ -22,6 +22,7 @@ package org.apache.james.jmap.model;
 import java.util.Objects;
 
 import com.fasterxml.jackson.annotation.JsonValue;
+import com.google.common.base.MoreObjects;
 
 public class MailboxCreationId {
 
@@ -52,4 +53,11 @@ public class MailboxCreationId {
     public int hashCode() {
         return Objects.hashCode(creationId);
     }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+            .add("creationId", creationId)
+            .toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxProperty.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxProperty.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxProperty.java
index 393e64b..5508073 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxProperty.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxProperty.java
@@ -21,6 +21,7 @@ package org.apache.james.jmap.model;
 import java.util.Arrays;
 import java.util.Optional;
 
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 
 public enum MailboxProperty implements Property {
@@ -57,4 +58,11 @@ public enum MailboxProperty implements Property {
             .filter(element -> element.fieldName.equals(value))
             .findAny();
     }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+            .add("fieldName", fieldName)
+            .toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageProperties.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageProperties.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageProperties.java
index f53fe5f..d8b23db 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageProperties.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageProperties.java
@@ -25,6 +25,7 @@ import java.util.Optional;
 import java.util.stream.Stream;
 
 import com.github.steveash.guavate.Guavate;
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
@@ -244,4 +245,12 @@ public class MessageProperties {
             return Objects.toString(fieldName);
         }
     }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+            .add("headersProperties", headersProperties)
+            .add("messageProperties", messageProperties)
+            .toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/VacationResponse.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/VacationResponse.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/VacationResponse.java
index 37816a0..0266f60 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/VacationResponse.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/VacationResponse.java
@@ -34,6 +34,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 
 @JsonDeserialize(builder = VacationResponse.Builder.class)
@@ -221,4 +222,14 @@ public class VacationResponse {
     public int hashCode() {
         return Objects.hash(id, isEnabled, fromDate, toDate, textBody, subject, htmlBody, isActivated);
     }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+            .add("id", id)
+            .add("fromDate", fromDate)
+            .add("toDate", toDate)
+            .add("isActivated", isActivated)
+            .toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java
index 1bac2d0..5c4d338 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java
@@ -93,7 +93,7 @@ public class JMAPServletTest {
     }
 
     @Test
-    public void mustReturnInvalidArgumentOnInvalidState() {
+    public void mustReturnInvalidArgumentOnInvalidState() throws Exception {
         ObjectNode json = new ObjectNode(new JsonNodeFactory(false));
         json.put("type", "invalidArgument");
 
@@ -110,7 +110,7 @@ public class JMAPServletTest {
     }
 
     @Test
-    public void mustReturnAccountsOnValidRequest() {
+    public void mustReturnAccountsOnValidRequest() throws Exception {
         ObjectNode json = new ObjectNode(new JsonNodeFactory(false));
         json.put("state", "f6a7e214");
         ArrayNode arrayNode = json.putArray("list");

http://git-wip-us.apache.org/repos/asf/james-project/blob/176d7bf5/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java
index 303aa47..ac388e7 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java
@@ -134,7 +134,7 @@ public class RequestHandlerTest {
 
 
     @Test(expected=IllegalStateException.class)
-    public void processShouldThrowWhenUnknownMethod() {
+    public void processShouldThrowWhenUnknownMethod() throws Exception {
         JsonNode[] nodes = new JsonNode[] { new ObjectNode(new JsonNodeFactory(false)).textNode("unknwonMethod"),
                 new ObjectNode(new JsonNodeFactory(false)).putObject("{\"id\": \"id\"}"),
                 new ObjectNode(new JsonNodeFactory(false)).textNode("#1")} ;
@@ -199,7 +199,7 @@ public class RequestHandlerTest {
     }
 
     @Test
-    public void processShouldWorkWhenKnownMethod() {
+    public void processShouldWorkWhenKnownMethod() throws Exception {
         ObjectNode parameters = new ObjectNode(new JsonNodeFactory(false));
         parameters.put("id", "testId");
         parameters.put("name", "testName");


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