chibenwa commented on a change in pull request #391:
URL: https://github.com/apache/james-project/pull/391#discussion_r623186096



##########
File path: 
server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedMDNSendMethodTest.java
##########
@@ -56,8 +54,7 @@
         .extension(new CassandraExtension())
         .extension(new RabbitMQExtension())
         .extension(new AwsS3BlobStoreExtension())
-        .server(configuration -> 
CassandraRabbitMQJamesServerMain.createServer(configuration)
-            .overrideWith(new TestJMAPServerModule()))
+        .server(configuration -> 
CassandraRabbitMQJamesServerMain.createServer(configuration))

Review comment:
       You lost TestJMAPServerModule

##########
File path: 
server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/CustomMethodContract.scala
##########
@@ -179,6 +231,80 @@ trait CustomMethodContract {
       .build
   }
 
+  @Test
+  def 
pushShouldSupportCustomTypeNameAndIntStateWithDataTypesAreMyTypeName(server: 
GuiceJamesServer): Unit = {
+    val accountId: AccountId = AccountId.fromUsername(BOB)
+    val intState = IntState.fromString("1")
+    val stateChangeEvent: StateChangeEvent = StateChangeEvent(eventId = 
CustomMethodContract.eventId, username = BOB, map = Map(CustomTypeName -> 
intState))
+    Thread.sleep(100)
+
+    val response: Either[String, List[String]] =
+      authenticatedRequest(server)
+        .response(asWebSocket[Identity, List[String]] {
+          ws =>
+            ws.send(WebSocketFrame.text(
+              """{
+                |  "@type": "WebSocketPushEnable",
+                |  "dataTypes": ["MyTypeName"]
+                |}""".stripMargin))
+
+            Thread.sleep(100)
+
+            server.getProbe(classOf[JmapEventBusProbe])
+              .emitStateChange(stateChangeEvent, accountId)
+
+            List(ws.receive()
+                .map { case t: Text =>
+                  t.payload
+                })
+        })
+        .send(backend)
+        .body
+
+    Thread.sleep(100)
+    val stateChange: String = 
s"""{"@type":"StateChange","changed":{"$ACCOUNT_ID":{"MyTypeName":"${intState.serialize}"}}}"""
+
+    assertThat(response.toOption.get.asJava)
+      .containsOnly(stateChange)
+  }
+
+  @Test
+  def pushShouldSupportCustomTypeNameAndIntStateWithDataTypesAreNull(server: 
GuiceJamesServer): Unit = {
+    val accountId: AccountId = AccountId.fromUsername(BOB)
+    val intState = IntState(1)
+    val stateChangeEvent: StateChangeEvent = StateChangeEvent(eventId = 
CustomMethodContract.eventId, username = BOB, map = Map(CustomTypeName -> 
intState))
+    Thread.sleep(100)
+
+    val response: Either[String, List[String]] =
+      authenticatedRequest(server)
+        .response(asWebSocket[Identity, List[String]] {
+          ws =>
+            ws.send(WebSocketFrame.text(
+              """{
+                |  "@type": "WebSocketPushEnable",
+                |  "dataTypes": null
+                |}""".stripMargin))
+
+            Thread.sleep(100)
+
+            server.getProbe(classOf[JmapEventBusProbe])
+              .emitStateChange(stateChangeEvent, accountId)
+
+            List(ws.receive()

Review comment:
       Idem you can remove this list...

##########
File path: 
server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/CustomMethodContract.scala
##########
@@ -179,6 +231,80 @@ trait CustomMethodContract {
       .build
   }
 
+  @Test
+  def 
pushShouldSupportCustomTypeNameAndIntStateWithDataTypesAreMyTypeName(server: 
GuiceJamesServer): Unit = {
+    val accountId: AccountId = AccountId.fromUsername(BOB)
+    val intState = IntState.fromString("1")
+    val stateChangeEvent: StateChangeEvent = StateChangeEvent(eventId = 
CustomMethodContract.eventId, username = BOB, map = Map(CustomTypeName -> 
intState))
+    Thread.sleep(100)
+
+    val response: Either[String, List[String]] =

Review comment:
       1. Put `Either[String, String]` here...

##########
File path: 
server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/TypeStateFactory.scala
##########
@@ -0,0 +1,15 @@
+package org.apache.james.jmap.change

Review comment:
       Missing license

##########
File path: 
server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/change/TypeStateFactoryTest.scala
##########
@@ -0,0 +1,49 @@
+package org.apache.james.jmap.change

Review comment:
       License

##########
File path: 
server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/JmapEventSerializer.scala
##########
@@ -42,10 +41,10 @@ object StateChangeEventDTO {
     getType = classOf[StateChangeEvent].getCanonicalName,
     getEventId = event.eventId.getId.toString,
     getUsername = event.username.asString(),
-    getMailboxState = event.mailboxState.map(_.value).map(_.toString).toJava,
-    getEmailState = event.emailState.map(_.value).map(_.toString).toJava,
-    getVacationResponseState = 
event.vacationResponseState.map(_.value).map(_.toString).toJava,
-    getEmailDeliveryState = 
event.emailDeliveryState.map(_.value).map(_.toString).toJava)
+    getMailboxState = event.getState(MailboxTypeName).map(state => 
state.serialize).toJava,
+    getEmailState = event.getState(EmailTypeName).map(state => 
state.serialize).toJava,

Review comment:
       ```suggestion
       getEmailState = event.getState(EmailTypeName).map(_.serialize).toJava,
   ```

##########
File path: 
server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/JmapEventSerializer.scala
##########
@@ -42,10 +41,10 @@ object StateChangeEventDTO {
     getType = classOf[StateChangeEvent].getCanonicalName,
     getEventId = event.eventId.getId.toString,
     getUsername = event.username.asString(),
-    getMailboxState = event.mailboxState.map(_.value).map(_.toString).toJava,
-    getEmailState = event.emailState.map(_.value).map(_.toString).toJava,
-    getVacationResponseState = 
event.vacationResponseState.map(_.value).map(_.toString).toJava,
-    getEmailDeliveryState = 
event.emailDeliveryState.map(_.value).map(_.toString).toJava)
+    getMailboxState = event.getState(MailboxTypeName).map(state => 
state.serialize).toJava,
+    getEmailState = event.getState(EmailTypeName).map(state => 
state.serialize).toJava,
+    getVacationResponseState = 
event.getState(VacationResponseTypeName).map(state => state.serialize).toJava,
+    getEmailDeliveryState = event.getState(EmailDeliveryTypeName).map(state => 
state.serialize).toJava)
 }
 
 case class StateChangeEventDTO(@JsonProperty("type") getType: String,

Review comment:
       The DTO should rely on a Map<String, String> so that it carries over 
thegeneric typeStates no?
   
   (Did you run the distributed version of your 'custom typeName' test?)

##########
File path: 
server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/JmapEventSerializer.scala
##########
@@ -42,10 +41,10 @@ object StateChangeEventDTO {
     getType = classOf[StateChangeEvent].getCanonicalName,
     getEventId = event.eventId.getId.toString,
     getUsername = event.username.asString(),
-    getMailboxState = event.mailboxState.map(_.value).map(_.toString).toJava,
-    getEmailState = event.emailState.map(_.value).map(_.toString).toJava,
-    getVacationResponseState = 
event.vacationResponseState.map(_.value).map(_.toString).toJava,
-    getEmailDeliveryState = 
event.emailDeliveryState.map(_.value).map(_.toString).toJava)
+    getMailboxState = event.getState(MailboxTypeName).map(state => 
state.serialize).toJava,
+    getEmailState = event.getState(EmailTypeName).map(state => 
state.serialize).toJava,
+    getVacationResponseState = 
event.getState(VacationResponseTypeName).map(state => state.serialize).toJava,
+    getEmailDeliveryState = event.getState(EmailDeliveryTypeName).map(state => 
state.serialize).toJava)

Review comment:
       ```suggestion
       getEmailDeliveryState = 
event.getState(EmailDeliveryTypeName).map(_.serialize).toJava)
   ```

##########
File path: 
server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/CustomMethodContract.scala
##########
@@ -179,6 +231,80 @@ trait CustomMethodContract {
       .build
   }
 
+  @Test
+  def 
pushShouldSupportCustomTypeNameAndIntStateWithDataTypesAreMyTypeName(server: 
GuiceJamesServer): Unit = {
+    val accountId: AccountId = AccountId.fromUsername(BOB)
+    val intState = IntState.fromString("1")
+    val stateChangeEvent: StateChangeEvent = StateChangeEvent(eventId = 
CustomMethodContract.eventId, username = BOB, map = Map(CustomTypeName -> 
intState))
+    Thread.sleep(100)
+
+    val response: Either[String, List[String]] =
+      authenticatedRequest(server)
+        .response(asWebSocket[Identity, List[String]] {
+          ws =>
+            ws.send(WebSocketFrame.text(
+              """{
+                |  "@type": "WebSocketPushEnable",
+                |  "dataTypes": ["MyTypeName"]
+                |}""".stripMargin))
+
+            Thread.sleep(100)
+
+            server.getProbe(classOf[JmapEventBusProbe])
+              .emitStateChange(stateChangeEvent, accountId)
+
+            List(ws.receive()

Review comment:
       And 2. you can remove the `List` here

##########
File path: 
server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/JmapEventSerializer.scala
##########
@@ -58,10 +57,13 @@ case class StateChangeEventDTO(@JsonProperty("type") 
getType: String,
   def toDomainObject: StateChangeEvent = StateChangeEvent(
     eventId = EventId.of(getEventId),
     username = Username.of(getUsername),
-    vacationResponseState = 
getVacationResponseState.toScala.map(State.fromStringUnchecked),
-    mailboxState = getMailboxState.toScala.map(State.fromStringUnchecked),
-    emailState = getEmailState.toScala.map(State.fromStringUnchecked),
-    emailDeliveryState = 
getEmailDeliveryState.toScala.map(State.fromStringUnchecked))
+    map = (toMap(getVacationResponseState, VacationResponseTypeName) ++
+      toMap(getMailboxState, MailboxTypeName) ++
+      toMap(getEmailState, EmailTypeName) ++
+      toMap(getEmailDeliveryState, EmailDeliveryTypeName)))

Review comment:
       ```suggestion
       map = List(
          VacationResponseTypeName -> getVacationResponseState, // state can be 
optional...
          MailboxResponseTypeName -> getMailboxResponseState, // state can be 
optional...  
          // etc... )
          .flatMap {
              case (typeName, None) => None
              case (typeName, Some(state)) => Some(typeName -> state)
          }.toMap
   ```

##########
File path: 
server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Session.scala
##########
@@ -31,7 +27,11 @@ import org.apache.james.core.Username
 import org.apache.james.jmap.api.change.{EmailChanges, MailboxChanges, State 
=> JavaState}
 import org.apache.james.jmap.core.CapabilityIdentifier.CapabilityIdentifier
 import org.apache.james.jmap.core.Id.Id
-import org.apache.james.jmap.core.State.INSTANCE
+import org.apache.james.jmap.core.UuidState.INSTANCE
+
+import java.net.URL
+import java.nio.charset.StandardCharsets
+import java.util.UUID

Review comment:
       Oups wrong import reorder

##########
File path: 
server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/JmapEventSerializer.scala
##########
@@ -42,10 +41,10 @@ object StateChangeEventDTO {
     getType = classOf[StateChangeEvent].getCanonicalName,
     getEventId = event.eventId.getId.toString,
     getUsername = event.username.asString(),
-    getMailboxState = event.mailboxState.map(_.value).map(_.toString).toJava,
-    getEmailState = event.emailState.map(_.value).map(_.toString).toJava,
-    getVacationResponseState = 
event.vacationResponseState.map(_.value).map(_.toString).toJava,
-    getEmailDeliveryState = 
event.emailDeliveryState.map(_.value).map(_.toString).toJava)
+    getMailboxState = event.getState(MailboxTypeName).map(state => 
state.serialize).toJava,
+    getEmailState = event.getState(EmailTypeName).map(state => 
state.serialize).toJava,
+    getVacationResponseState = 
event.getState(VacationResponseTypeName).map(state => state.serialize).toJava,

Review comment:
       ```suggestion
       getVacationResponseState = 
event.getState(VacationResponseTypeName).map(_.serialize).toJava,
   ```

##########
File path: 
server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/JmapEventSerializer.scala
##########
@@ -42,10 +41,10 @@ object StateChangeEventDTO {
     getType = classOf[StateChangeEvent].getCanonicalName,
     getEventId = event.eventId.getId.toString,
     getUsername = event.username.asString(),
-    getMailboxState = event.mailboxState.map(_.value).map(_.toString).toJava,
-    getEmailState = event.emailState.map(_.value).map(_.toString).toJava,
-    getVacationResponseState = 
event.vacationResponseState.map(_.value).map(_.toString).toJava,
-    getEmailDeliveryState = 
event.emailDeliveryState.map(_.value).map(_.toString).toJava)
+    getMailboxState = event.getState(MailboxTypeName).map(state => 
state.serialize).toJava,

Review comment:
       ```suggestion
       getMailboxState = 
event.getState(MailboxTypeName).map(_.serialize).toJava,
   ```
   

##########
File path: 
server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/ResponseSerializer.scala
##########
@@ -35,9 +31,10 @@ import org.apache.james.jmap.core.{Account, Invocation, 
Session, _}
 import play.api.libs.functional.syntax._
 import play.api.libs.json._
 
+import java.io.InputStream
+import java.net.URL

Review comment:
       Oups wrong import reorder

##########
File path: 
server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/CustomMethodContract.scala
##########
@@ -179,6 +231,80 @@ trait CustomMethodContract {
       .build
   }
 
+  @Test
+  def 
pushShouldSupportCustomTypeNameAndIntStateWithDataTypesAreMyTypeName(server: 
GuiceJamesServer): Unit = {
+    val accountId: AccountId = AccountId.fromUsername(BOB)
+    val intState = IntState.fromString("1")
+    val stateChangeEvent: StateChangeEvent = StateChangeEvent(eventId = 
CustomMethodContract.eventId, username = BOB, map = Map(CustomTypeName -> 
intState))
+    Thread.sleep(100)
+
+    val response: Either[String, List[String]] =
+      authenticatedRequest(server)
+        .response(asWebSocket[Identity, List[String]] {
+          ws =>
+            ws.send(WebSocketFrame.text(
+              """{
+                |  "@type": "WebSocketPushEnable",
+                |  "dataTypes": ["MyTypeName"]
+                |}""".stripMargin))
+
+            Thread.sleep(100)
+
+            server.getProbe(classOf[JmapEventBusProbe])
+              .emitStateChange(stateChangeEvent, accountId)
+
+            List(ws.receive()
+                .map { case t: Text =>
+                  t.payload
+                })
+        })
+        .send(backend)
+        .body
+
+    Thread.sleep(100)
+    val stateChange: String = 
s"""{"@type":"StateChange","changed":{"$ACCOUNT_ID":{"MyTypeName":"${intState.serialize}"}}}"""
+
+    assertThat(response.toOption.get.asJava)

Review comment:
       3... that would make this assertion easier...

##########
File path: 
server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryMDNSendMethodTest.java
##########
@@ -21,23 +21,21 @@
 
 import static 
org.apache.james.MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE;
 
+import java.util.concurrent.ThreadLocalRandom;
+
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.JamesServerBuilder;
 import org.apache.james.JamesServerExtension;
 import org.apache.james.jmap.rfc8621.contract.MDNSendMethodContract;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.modules.TestJMAPServerModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-import java.util.concurrent.ThreadLocalRandom;
-
 public class MemoryMDNSendMethodTest implements MDNSendMethodContract {
     @RegisterExtension
     static JamesServerExtension testExtension = new 
JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> 
GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(IN_MEMORY_SERVER_AGGREGATE_MODULE)
-            .overrideWith(new TestJMAPServerModule()))
+            .combineWith(IN_MEMORY_SERVER_AGGREGATE_MODULE))

Review comment:
       You lost TestJMAPServerModule




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to