diff --git a/java_socketio_chatroom_server/.classpath b/java_socketio_chatroom_server/.classpath
index 5e8a55f..8e80949 100755
--- a/java_socketio_chatroom_server/.classpath
+++ b/java_socketio_chatroom_server/.classpath
@@ -23,5 +23,12 @@
+
+
+
+
+
+
+
diff --git a/java_socketio_chatroom_server/.settings/org.eclipse.core.resources.prefs b/java_socketio_chatroom_server/.settings/org.eclipse.core.resources.prefs
index f9fe345..c293e5d 100755
--- a/java_socketio_chatroom_server/.settings/org.eclipse.core.resources.prefs
+++ b/java_socketio_chatroom_server/.settings/org.eclipse.core.resources.prefs
@@ -1,4 +1,5 @@
eclipse.preferences.version=1
+encoding//src/it/java=UTF-8
encoding//src/main/java=UTF-8
encoding//src/test/java=UTF-8
encoding/=UTF-8
diff --git a/java_socketio_chatroom_server/pom.xml b/java_socketio_chatroom_server/pom.xml
index 8a4bff0..00e3d5e 100755
--- a/java_socketio_chatroom_server/pom.xml
+++ b/java_socketio_chatroom_server/pom.xml
@@ -22,7 +22,7 @@
0.8.7
1.6.6
4.3.0
-
+ 3.12.8
4.0.1
9.4.41.v20210516
9.4.41.v20210516
@@ -59,6 +59,11 @@
import
pom
+
+ org.mongodb
+ mongo-java-driver
+ ${mongo.driver.version}
+
javax.servlet
javax.servlet-api
@@ -118,6 +123,10 @@
org.apache.logging.log4j
log4j-core
+
+ org.mongodb
+ mongo-java-driver
+
javax.servlet
javax.servlet-api
@@ -168,6 +177,18 @@
maven-surefire-plugin
2.22.1
+
+ maven-failsafe-plugin
+ 2.22.2
+
+
+
+ integration-test
+ verify
+
+
+
+
maven-jar-plugin
3.0.2
@@ -210,10 +231,60 @@
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+ 3.2.0
+
+
+ add-test-source
+ generate-test-sources
+
+ add-test-source
+
+
+
+ src/it/java
+
+
+
+
+
org.jacoco
jacoco-maven-plugin
${jacoco.plugin.version}
+
+
+
+
+ prepare-agent
+
+ report
+
+
+
+ jacoco-check
+
+
+ check
+
+
+
+
+ PACKAGE
+
+
+ LINE
+ COVEREDRATIO
+ 1
+
+
+
+
+
+
+
org.pitest
@@ -232,6 +303,11 @@
coveralls-maven-plugin
${coveralls.plugin.version}
+
+ io.fabric8
+ docker-maven-plugin
+ 0.36.0
+
@@ -240,18 +316,44 @@
maven-assembly-plugin
- org.jacoco
- jacoco-maven-plugin
-
-
- **/ServerWrapper.*
- **/ServerWrapper$*.*
-
-
+ maven-failsafe-plugin
+
+
- org.pitest
- pitest-maven
+ io.fabric8
+ docker-maven-plugin
+
+
+
+ mongo:4.2.14
+
+
+
+ 27017:27017
+
+
+
+
+
+
+
+ docker-start
+ pre-integration-test
+
+ start
+
+
+
+ docker-stop
+ post-integration-test
+
+ stop
+
+
+
@@ -274,14 +376,20 @@
org.jacoco
jacoco-maven-plugin
-
-
-
- prepare-agent
- report
-
-
-
+
+
+ **/Message.*
+ **/ServerWrapper.*
+ **/ServerWrapper$*.*
+
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+
+
+ maven-failsafe-plugin
@@ -294,9 +402,17 @@
org.pitest
pitest-maven
+
+
+ io.github.marcodiri.java_socketio_chatroom_server.model.*
+
+
+ io.github.marcodiri.java_socketio_chatroom_server.*
+
+
- verify
+ integration-test
mutationCoverage
diff --git a/java_socketio_chatroom_server/src/it/java/io/github/marcodiri/java_socketio_chatroom_server/repository/mongo/ServerMongoRepositoryIT.java b/java_socketio_chatroom_server/src/it/java/io/github/marcodiri/java_socketio_chatroom_server/repository/mongo/ServerMongoRepositoryIT.java
new file mode 100755
index 0000000..344608b
--- /dev/null
+++ b/java_socketio_chatroom_server/src/it/java/io/github/marcodiri/java_socketio_chatroom_server/repository/mongo/ServerMongoRepositoryIT.java
@@ -0,0 +1,79 @@
+package io.github.marcodiri.java_socketio_chatroom_server.repository.mongo;
+
+import static io.github.marcodiri.java_socketio_chatroom_server.repository.mongo.ServerMongoRepository.CHATROOM_DB_NAME;
+import static io.github.marcodiri.java_socketio_chatroom_server.repository.mongo.ServerMongoRepository.MESSAGES_COLLECTION_NAME;
+
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+import static java.util.Arrays.asList;
+import static org.assertj.core.api.Assertions.assertThat;
+import org.bson.Document;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.mongodb.MongoClient;
+import com.mongodb.ServerAddress;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoDatabase;
+
+import io.github.marcodiri.java_socketio_chatroom_server.model.Message;
+
+public class ServerMongoRepositoryIT {
+ private static int mongoPort = Integer.parseInt(System.getProperty("mongo.port", "27017"));
+ private MongoClient client;
+ private ServerMongoRepository serverRepository;
+ private MongoCollection messagesCollection;
+
+ @Before
+ public void setup() {
+ client = new MongoClient(
+ new ServerAddress("localhost", mongoPort)
+ );
+ serverRepository = new ServerMongoRepository(client);
+ MongoDatabase database = client.getDatabase(CHATROOM_DB_NAME);
+ database.drop();
+ messagesCollection = database.getCollection(MESSAGES_COLLECTION_NAME);
+ }
+
+ @Test
+ public void testFindAll() {
+ Timestamp ts1 = new Timestamp(System.currentTimeMillis());
+ Timestamp ts2 = new Timestamp(System.currentTimeMillis());
+
+ messagesCollection.insertMany(asList(
+ new Document()
+ .append("timestamp", ts1.getTime())
+ .append("user", "user1")
+ .append("message", "message1"),
+ new Document()
+ .append("timestamp", ts2.getTime())
+ .append("user", "user2")
+ .append("message", "message2")
+ ));
+
+ assertThat(serverRepository.findAll())
+ .containsExactly(
+ new Message(ts1, "user1", "message1"),
+ new Message(ts2, "user2", "message2")
+ );
+ }
+
+ @Test
+ public void testSave() {
+ Message msg = new Message(new Timestamp(System.currentTimeMillis()), "user", "message");
+ serverRepository.save(msg);
+ assertThat(readAllMessages()).containsExactly(msg);
+ }
+
+ private List readAllMessages() {
+ return StreamSupport.stream(messagesCollection.find().spliterator(), false)
+ .map(d -> new Message(
+ new Timestamp(Long.parseLong(d.get("timestamp").toString())),
+ "" + d.get("user"),
+ "" + d.get("message")))
+ .collect(Collectors.toList());
+ }
+}
diff --git a/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/model/Message.java b/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/model/Message.java
new file mode 100755
index 0000000..bf9814e
--- /dev/null
+++ b/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/model/Message.java
@@ -0,0 +1,53 @@
+package io.github.marcodiri.java_socketio_chatroom_server.model;
+
+import java.sql.Timestamp;
+import java.util.Objects;
+
+public final class Message {
+ private final Timestamp timestamp;
+ private final String user;
+ private final String message;
+
+ public Message(Timestamp timestamp, String user, String message) {
+ this.timestamp = new Timestamp(timestamp.getTime());
+ this.user = user;
+ this.message = message;
+ }
+
+ public Timestamp getTimestamp() {
+ return new Timestamp(timestamp.getTime());
+ }
+
+ public String getUser() {
+ return user;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuffer sb = new StringBuffer("Message{");
+ sb.append("timestamp=").append(timestamp);
+ sb.append(", user=").append(user);
+ sb.append(", message=").append(message);
+ sb.append('}');
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ Message msg = (Message) o;
+ return Objects.equals(timestamp, msg.timestamp) && Objects.equals(user, msg.user) && Objects.equals(message, msg.message);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(timestamp, user, message);
+ }
+}
diff --git a/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/repository/ServerRepository.java b/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/repository/ServerRepository.java
new file mode 100755
index 0000000..0fcf804
--- /dev/null
+++ b/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/repository/ServerRepository.java
@@ -0,0 +1,11 @@
+package io.github.marcodiri.java_socketio_chatroom_server.repository;
+
+import java.util.List;
+
+import io.github.marcodiri.java_socketio_chatroom_server.model.Message;
+
+public interface ServerRepository {
+ public List findAll();
+
+ public void save(Message message);
+}
diff --git a/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/repository/mongo/ServerMongoRepository.java b/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/repository/mongo/ServerMongoRepository.java
new file mode 100755
index 0000000..90c81e2
--- /dev/null
+++ b/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/repository/mongo/ServerMongoRepository.java
@@ -0,0 +1,50 @@
+package io.github.marcodiri.java_socketio_chatroom_server.repository.mongo;
+
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+import org.bson.Document;
+
+import com.mongodb.MongoClient;
+import com.mongodb.client.MongoCollection;
+import io.github.marcodiri.java_socketio_chatroom_server.model.Message;
+import io.github.marcodiri.java_socketio_chatroom_server.repository.ServerRepository;
+
+public class ServerMongoRepository implements ServerRepository {
+ public static final String CHATROOM_DB_NAME = "chatroom";
+ public static final String MESSAGES_COLLECTION_NAME = "messages";
+ private MongoCollection msgCollection;
+
+ public ServerMongoRepository(MongoClient client) {
+ msgCollection = client
+ .getDatabase(CHATROOM_DB_NAME)
+ .getCollection(MESSAGES_COLLECTION_NAME);
+ }
+
+ @Override
+ public List findAll() {
+ return StreamSupport.
+ stream(msgCollection.find().spliterator(), false)
+ .map(this::fromDocumentToMessage)
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public void save(Message message) {
+ msgCollection.insertOne(
+ new Document()
+ .append("timestamp", message.getTimestamp().getTime())
+ .append("user", message.getUser())
+ .append("message", message.getMessage()));
+ }
+
+ private Message fromDocumentToMessage(Document d) {
+ return new Message(
+ new Timestamp(Long.parseLong(d.get("timestamp").toString())),
+ ""+d.get("user"),
+ ""+d.get("message"));
+ }
+
+}