From 145f89e6e2f56d22ccbf3c25e92a0dd40317b413 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Hallvard=20Tr=C3=A6tteberg?= <hal@ntnu.no>
Date: Sun, 26 Sep 2021 10:33:34 +0000
Subject: [PATCH] First attempt at modularization

---
 todolist/core/src/main/java/module-info.java   |  6 ++++++
 .../java/todolist/json/TodoPersistence.java    | 18 ++++++++++++++++--
 .../{ => internal}/TodoItemDeserializer.java   |  2 +-
 .../{ => internal}/TodoItemSerializer.java     |  2 +-
 .../{ => internal}/TodoListDeserializer.java   |  2 +-
 .../{ => internal}/TodoListSerializer.java     |  2 +-
 .../{ => internal}/TodoModelDeserializer.java  |  2 +-
 .../{ => internal}/TodoModelSerializer.java    |  2 +-
 .../json/{ => internal}/TodoModule.java        |  2 +-
 .../java/todolist/json/TodoModuleTest.java     |  1 +
 todolist/fxui/src/main/java/module-info.java   | 14 ++++++++++++++
 .../todolist/ui/RemoteTodoModelAccess.java     |  5 ++---
 todolist/fxutil/src/main/java/module-info.java |  8 ++++++++
 todolist/rest/pom.xml                          |  9 +++++++--
 todolist/rest/src/main/java/module-info.java   | 12 ++++++++++++
 .../TodoModuleObjectMapperProvider.java        |  4 ++--
 .../todolist/restserver/TodoServiceTest.java   |  2 +-
 .../restserver/src/main/java/module-info.java  |  8 ++++++++
 .../restserver/TodoModelApplication.java       |  6 ++++--
 .../restserver/TodoModelApplicationTest.java   |  4 ++--
 20 files changed, 90 insertions(+), 21 deletions(-)
 create mode 100644 todolist/core/src/main/java/module-info.java
 rename todolist/core/src/main/java/todolist/json/{ => internal}/TodoItemDeserializer.java (97%)
 rename todolist/core/src/main/java/todolist/json/{ => internal}/TodoItemSerializer.java (96%)
 rename todolist/core/src/main/java/todolist/json/{ => internal}/TodoListDeserializer.java (98%)
 rename todolist/core/src/main/java/todolist/json/{ => internal}/TodoListSerializer.java (97%)
 rename todolist/core/src/main/java/todolist/json/{ => internal}/TodoModelDeserializer.java (97%)
 rename todolist/core/src/main/java/todolist/json/{ => internal}/TodoModelSerializer.java (97%)
 rename todolist/core/src/main/java/todolist/json/{ => internal}/TodoModule.java (97%)
 create mode 100644 todolist/fxui/src/main/java/module-info.java
 create mode 100644 todolist/fxutil/src/main/java/module-info.java
 create mode 100644 todolist/rest/src/main/java/module-info.java
 create mode 100644 todolist/springboot/restserver/src/main/java/module-info.java

diff --git a/todolist/core/src/main/java/module-info.java b/todolist/core/src/main/java/module-info.java
new file mode 100644
index 0000000..baf3e83
--- /dev/null
+++ b/todolist/core/src/main/java/module-info.java
@@ -0,0 +1,6 @@
+module todolist.core {
+    requires transitive com.fasterxml.jackson.databind;
+
+    exports todolist.core;
+    exports todolist.json;
+}
diff --git a/todolist/core/src/main/java/todolist/json/TodoPersistence.java b/todolist/core/src/main/java/todolist/json/TodoPersistence.java
index e4816eb..99c653f 100644
--- a/todolist/core/src/main/java/todolist/json/TodoPersistence.java
+++ b/todolist/core/src/main/java/todolist/json/TodoPersistence.java
@@ -1,6 +1,9 @@
 package todolist.json;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
@@ -9,7 +12,10 @@ import java.io.Writer;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+
+
 import todolist.core.TodoModel;
+import todolist.json.internal.TodoModule;
 
 /**
  * Wrapper class for JSON serialization,
@@ -20,8 +26,16 @@ public class TodoPersistence {
   private ObjectMapper mapper;
 
   public TodoPersistence() {
-    mapper = new ObjectMapper();
-    mapper.registerModule(new TodoModule());
+    mapper = createObjectMapper();
+  }
+
+  public static SimpleModule createJacksonModule(boolean deep) {
+    return new TodoModule(deep);
+  }
+
+  public static ObjectMapper createObjectMapper() {
+    return new ObjectMapper()
+      .registerModule(createJacksonModule(true));
   }
 
   public TodoModel readTodoModel(Reader reader) throws IOException {
diff --git a/todolist/core/src/main/java/todolist/json/TodoItemDeserializer.java b/todolist/core/src/main/java/todolist/json/internal/TodoItemDeserializer.java
similarity index 97%
rename from todolist/core/src/main/java/todolist/json/TodoItemDeserializer.java
rename to todolist/core/src/main/java/todolist/json/internal/TodoItemDeserializer.java
index 1279de0..1c22f4c 100644
--- a/todolist/core/src/main/java/todolist/json/TodoItemDeserializer.java
+++ b/todolist/core/src/main/java/todolist/json/internal/TodoItemDeserializer.java
@@ -1,4 +1,4 @@
-package todolist.json;
+package todolist.json.internal;
 
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.JsonProcessingException;
diff --git a/todolist/core/src/main/java/todolist/json/TodoItemSerializer.java b/todolist/core/src/main/java/todolist/json/internal/TodoItemSerializer.java
similarity index 96%
rename from todolist/core/src/main/java/todolist/json/TodoItemSerializer.java
rename to todolist/core/src/main/java/todolist/json/internal/TodoItemSerializer.java
index e3f2ef4..f52fe40 100644
--- a/todolist/core/src/main/java/todolist/json/TodoItemSerializer.java
+++ b/todolist/core/src/main/java/todolist/json/internal/TodoItemSerializer.java
@@ -1,4 +1,4 @@
-package todolist.json;
+package todolist.json.internal;
 
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.JsonSerializer;
diff --git a/todolist/core/src/main/java/todolist/json/TodoListDeserializer.java b/todolist/core/src/main/java/todolist/json/internal/TodoListDeserializer.java
similarity index 98%
rename from todolist/core/src/main/java/todolist/json/TodoListDeserializer.java
rename to todolist/core/src/main/java/todolist/json/internal/TodoListDeserializer.java
index e0da113..953611e 100644
--- a/todolist/core/src/main/java/todolist/json/TodoListDeserializer.java
+++ b/todolist/core/src/main/java/todolist/json/internal/TodoListDeserializer.java
@@ -1,4 +1,4 @@
-package todolist.json;
+package todolist.json.internal;
 
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.JsonProcessingException;
diff --git a/todolist/core/src/main/java/todolist/json/TodoListSerializer.java b/todolist/core/src/main/java/todolist/json/internal/TodoListSerializer.java
similarity index 97%
rename from todolist/core/src/main/java/todolist/json/TodoListSerializer.java
rename to todolist/core/src/main/java/todolist/json/internal/TodoListSerializer.java
index d6d6339..1124d68 100644
--- a/todolist/core/src/main/java/todolist/json/TodoListSerializer.java
+++ b/todolist/core/src/main/java/todolist/json/internal/TodoListSerializer.java
@@ -1,4 +1,4 @@
-package todolist.json;
+package todolist.json.internal;
 
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.JsonSerializer;
diff --git a/todolist/core/src/main/java/todolist/json/TodoModelDeserializer.java b/todolist/core/src/main/java/todolist/json/internal/TodoModelDeserializer.java
similarity index 97%
rename from todolist/core/src/main/java/todolist/json/TodoModelDeserializer.java
rename to todolist/core/src/main/java/todolist/json/internal/TodoModelDeserializer.java
index e4dd3a0..100866f 100644
--- a/todolist/core/src/main/java/todolist/json/TodoModelDeserializer.java
+++ b/todolist/core/src/main/java/todolist/json/internal/TodoModelDeserializer.java
@@ -1,4 +1,4 @@
-package todolist.json;
+package todolist.json.internal;
 
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.JsonProcessingException;
diff --git a/todolist/core/src/main/java/todolist/json/TodoModelSerializer.java b/todolist/core/src/main/java/todolist/json/internal/TodoModelSerializer.java
similarity index 97%
rename from todolist/core/src/main/java/todolist/json/TodoModelSerializer.java
rename to todolist/core/src/main/java/todolist/json/internal/TodoModelSerializer.java
index 202bc46..a1aa0c8 100644
--- a/todolist/core/src/main/java/todolist/json/TodoModelSerializer.java
+++ b/todolist/core/src/main/java/todolist/json/internal/TodoModelSerializer.java
@@ -1,4 +1,4 @@
-package todolist.json;
+package todolist.json.internal;
 
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.JsonSerializer;
diff --git a/todolist/core/src/main/java/todolist/json/TodoModule.java b/todolist/core/src/main/java/todolist/json/internal/TodoModule.java
similarity index 97%
rename from todolist/core/src/main/java/todolist/json/TodoModule.java
rename to todolist/core/src/main/java/todolist/json/internal/TodoModule.java
index ecf0a39..97502fb 100644
--- a/todolist/core/src/main/java/todolist/json/TodoModule.java
+++ b/todolist/core/src/main/java/todolist/json/internal/TodoModule.java
@@ -1,4 +1,4 @@
-package todolist.json;
+package todolist.json.internal;
 
 import com.fasterxml.jackson.core.Version;
 import com.fasterxml.jackson.databind.module.SimpleModule;
diff --git a/todolist/core/src/test/java/todolist/json/TodoModuleTest.java b/todolist/core/src/test/java/todolist/json/TodoModuleTest.java
index 88248d6..0a7317d 100644
--- a/todolist/core/src/test/java/todolist/json/TodoModuleTest.java
+++ b/todolist/core/src/test/java/todolist/json/TodoModuleTest.java
@@ -14,6 +14,7 @@ import todolist.core.AbstractTodoList;
 import todolist.core.TodoItem;
 import todolist.core.TodoList;
 import todolist.core.TodoModel;
+import todolist.json.internal.TodoModule;
 
 public class TodoModuleTest {
 
diff --git a/todolist/fxui/src/main/java/module-info.java b/todolist/fxui/src/main/java/module-info.java
new file mode 100644
index 0000000..b1707f4
--- /dev/null
+++ b/todolist/fxui/src/main/java/module-info.java
@@ -0,0 +1,14 @@
+module todolist.ui {
+    requires com.fasterxml.jackson.databind;
+
+    requires java.net.http;
+
+    requires javafx.base;
+    requires javafx.controls;
+    requires javafx.fxml;
+
+    requires todolist.core;
+    requires fxutil;
+
+    opens todolist.ui to javafx.graphics, javafx.fxml;
+}
diff --git a/todolist/fxui/src/main/java/todolist/ui/RemoteTodoModelAccess.java b/todolist/fxui/src/main/java/todolist/ui/RemoteTodoModelAccess.java
index 808d9d2..9e48d59 100644
--- a/todolist/fxui/src/main/java/todolist/ui/RemoteTodoModelAccess.java
+++ b/todolist/fxui/src/main/java/todolist/ui/RemoteTodoModelAccess.java
@@ -14,7 +14,7 @@ import java.util.Collection;
 import todolist.core.AbstractTodoList;
 import todolist.core.TodoList;
 import todolist.core.TodoModel;
-import todolist.json.TodoModule;
+import todolist.json.TodoPersistence;
 
 /**
  * Class that centralizes access to a TodoModel. Makes it easier to support transparent use of a
@@ -30,7 +30,7 @@ public class RemoteTodoModelAccess implements TodoModelAccess {
 
   public RemoteTodoModelAccess(URI endpointBaseUri) {
     this.endpointBaseUri = endpointBaseUri;
-    objectMapper = new ObjectMapper().registerModule(new TodoModule());
+    objectMapper = TodoPersistence.createObjectMapper();
   }
 
   private TodoModel getTodoModel() {
@@ -44,7 +44,6 @@ public class RemoteTodoModelAccess implements TodoModelAccess {
             HttpClient.newBuilder().build().send(request, HttpResponse.BodyHandlers.ofString());
         final String responseString = response.body();
         this.todoModel = objectMapper.readValue(responseString, TodoModel.class);
-        System.out.println("TodoModel: " + this.todoModel);
       } catch (IOException | InterruptedException e) {
         throw new RuntimeException(e);
       }
diff --git a/todolist/fxutil/src/main/java/module-info.java b/todolist/fxutil/src/main/java/module-info.java
new file mode 100644
index 0000000..1191da6
--- /dev/null
+++ b/todolist/fxutil/src/main/java/module-info.java
@@ -0,0 +1,8 @@
+module fxutil {
+    requires javafx.base;
+    requires javafx.controls;
+    requires javafx.fxml;
+
+    exports fxutil.doc;
+    opens fxutil to javafx.graphics, javafx.fxml;
+}
diff --git a/todolist/rest/pom.xml b/todolist/rest/pom.xml
index bfae039..9f7906a 100644
--- a/todolist/rest/pom.xml
+++ b/todolist/rest/pom.xml
@@ -12,8 +12,8 @@
     <artifactId>rest</artifactId>
 
     <properties>
-        <slf4jVersion>1.7.25</slf4jVersion>
-        <jerseyVersion>3.0.1</jerseyVersion>
+        <slf4jVersion>2.0.0-alpha5</slf4jVersion>
+        <jerseyVersion>3.0.3</jerseyVersion>
     </properties>
 
     <dependencies>
@@ -170,6 +170,11 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <argLine>
+                    --add-opens todolist.rest/todolist.restapi=ALL-UNNAMED
+                    </argLine>
+                </configuration>
             </plugin>
             <!-- Run the checkstyle code quality tool -->
             <plugin>
diff --git a/todolist/rest/src/main/java/module-info.java b/todolist/rest/src/main/java/module-info.java
new file mode 100644
index 0000000..e4c32e4
--- /dev/null
+++ b/todolist/rest/src/main/java/module-info.java
@@ -0,0 +1,12 @@
+module todolist.rest {
+    requires jakarta.ws.rs;
+
+    requires jersey.common;
+    requires jersey.server;
+    requires jersey.media.json.jackson;
+
+    requires org.glassfish.hk2.api;
+    requires org.slf4j;
+
+    requires todolist.core;
+}
\ No newline at end of file
diff --git a/todolist/rest/src/main/java/todolist/restserver/TodoModuleObjectMapperProvider.java b/todolist/rest/src/main/java/todolist/restserver/TodoModuleObjectMapperProvider.java
index 9846a28..dd0f81b 100644
--- a/todolist/rest/src/main/java/todolist/restserver/TodoModuleObjectMapperProvider.java
+++ b/todolist/rest/src/main/java/todolist/restserver/TodoModuleObjectMapperProvider.java
@@ -6,7 +6,7 @@ import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.ext.ContextResolver;
 import jakarta.ws.rs.ext.Provider;
-import todolist.json.TodoModule;
+import todolist.json.TodoPersistence;
 
 /**
  * Provides the Jackson module used for JSON serialization.
@@ -19,7 +19,7 @@ public class TodoModuleObjectMapperProvider implements ContextResolver<ObjectMap
   private final ObjectMapper objectMapper;
 
   public TodoModuleObjectMapperProvider() {
-    objectMapper = new ObjectMapper().registerModule(new TodoModule(false));
+    objectMapper = TodoPersistence.createObjectMapper();
   }
 
   @Override
diff --git a/todolist/rest/src/test/java/todolist/restserver/TodoServiceTest.java b/todolist/rest/src/test/java/todolist/restserver/TodoServiceTest.java
index e6ad88c..243679c 100644
--- a/todolist/rest/src/test/java/todolist/restserver/TodoServiceTest.java
+++ b/todolist/rest/src/test/java/todolist/restserver/TodoServiceTest.java
@@ -23,7 +23,7 @@ import todolist.restapi.TodoModelService;
 public class TodoServiceTest extends JerseyTest {
 
   protected boolean shouldLog() {
-    return false;
+    return true;
   }
 
   @Override
diff --git a/todolist/springboot/restserver/src/main/java/module-info.java b/todolist/springboot/restserver/src/main/java/module-info.java
new file mode 100644
index 0000000..400acc0
--- /dev/null
+++ b/todolist/springboot/restserver/src/main/java/module-info.java
@@ -0,0 +1,8 @@
+module todolist.springboot.rest {
+    requires com.fasterxml.jackson.databind;
+
+    requires spring.web;
+    requires spring.boot;
+
+    requires todolist.core;
+}
diff --git a/todolist/springboot/restserver/src/main/java/todolist/springboot/restserver/TodoModelApplication.java b/todolist/springboot/restserver/src/main/java/todolist/springboot/restserver/TodoModelApplication.java
index 60fed1d..f9d9fbb 100644
--- a/todolist/springboot/restserver/src/main/java/todolist/springboot/restserver/TodoModelApplication.java
+++ b/todolist/springboot/restserver/src/main/java/todolist/springboot/restserver/TodoModelApplication.java
@@ -4,14 +4,16 @@ import com.fasterxml.jackson.databind.Module;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.annotation.Bean;
-import todolist.json.TodoModule;
+
+import todolist.json.TodoPersistence;
+import todolist.json.internal.TodoModule;
 
 @SpringBootApplication
 public class TodoModelApplication {
 
   @Bean
   public Module objectMapperModule() {
-    return new TodoModule(false);
+    return TodoPersistence.createJacksonModule(false);
   }
 
   public static void main(String[] args) {
diff --git a/todolist/springboot/restserver/src/test/java/todolist/springboot/restserver/TodoModelApplicationTest.java b/todolist/springboot/restserver/src/test/java/todolist/springboot/restserver/TodoModelApplicationTest.java
index da70736..c69570c 100644
--- a/todolist/springboot/restserver/src/test/java/todolist/springboot/restserver/TodoModelApplicationTest.java
+++ b/todolist/springboot/restserver/src/test/java/todolist/springboot/restserver/TodoModelApplicationTest.java
@@ -20,7 +20,7 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
 import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
 import todolist.core.AbstractTodoList;
 import todolist.core.TodoModel;
-import todolist.json.TodoModule;
+import todolist.json.TodoPersistence;
 
 @AutoConfigureMockMvc
 @ContextConfiguration(classes = { TodoModelController.class, TodoModelService.class, TodoModelApplication.class })
@@ -34,7 +34,7 @@ public class TodoModelApplicationTest {
 
   @BeforeEach
   public void setup() throws Exception {
-    objectMapper = new ObjectMapper().registerModule(new TodoModule(false));;
+    objectMapper = TodoPersistence.createObjectMapper();
   }
 
   private String todoUrl(String... segments) {
-- 
GitLab