diff --git a/todolist/core/src/main/java/todolist/core/TodoModel.java b/todolist/core/src/main/java/todolist/core/TodoModel.java index c7544995e5073a92a6cd3738368fb8481c105751..b5320b4ae0ba005125ecad2f9f4bd3a3ecc3d7ac 100644 --- a/todolist/core/src/main/java/todolist/core/TodoModel.java +++ b/todolist/core/src/main/java/todolist/core/TodoModel.java @@ -43,7 +43,7 @@ public class TodoModel implements Iterable<TodoList> { /** * Replaces an existing TodoList with the same name, or adds it. * - * @param todoList + * @param todoList the TodoList * @return the replaced TodoList, or null */ public TodoList putTodoList(TodoList todoList) { diff --git a/todolist/fxui/src/main/java/todolist/ui/RemoteTodoModelAccess.java b/todolist/fxui/src/main/java/todolist/ui/RemoteTodoModelAccess.java index 3a82919c65486dd925174ef6b8b1aa9ba437ecb3..13044b8bae2bc39f2f99654c6107debdb5b80664 100644 --- a/todolist/fxui/src/main/java/todolist/ui/RemoteTodoModelAccess.java +++ b/todolist/fxui/src/main/java/todolist/ui/RemoteTodoModelAccess.java @@ -1,16 +1,16 @@ package todolist.ui; +import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.net.URI; import java.net.URLEncoder; import java.net.http.HttpClient; import java.net.http.HttpRequest; -import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; +import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; -import com.fasterxml.jackson.databind.ObjectMapper; import todolist.core.TodoList; import todolist.core.TodoModel; import todolist.json.TodoModule; @@ -35,9 +35,9 @@ public class RemoteTodoModelAccess implements TodoModelAccess { private TodoModel getTodoModel() { if (todoModel == null) { HttpRequest request = HttpRequest.newBuilder(endpointBaseUri) - .header("Accept", "application/json") - .GET() - .build(); + .header("Accept", "application/json") + .GET() + .build(); try { final HttpResponse<String> response = HttpClient.newBuilder().build().send(request, HttpResponse.BodyHandlers.ofString()); @@ -62,6 +62,14 @@ public class RemoteTodoModelAccess implements TodoModelAccess { return allNames; } + private String uriParam(String s) { + return URLEncoder.encode(s, StandardCharsets.UTF_8); + } + + private URI todoListUri(String name) { + return endpointBaseUri.resolve(uriParam(name)); + } + /** * Gets the TodoList with the given name. * @@ -73,8 +81,8 @@ public class RemoteTodoModelAccess implements TodoModelAccess { // if existing list has no todo items, try to (re)load if (oldTodoList == null || (!oldTodoList.iterator().hasNext())) { HttpRequest request = - HttpRequest.newBuilder(endpointBaseUri.resolve(URLEncoder.encode(name, StandardCharsets.UTF_8))) - .header("Accept", "application/json").GET().build(); + HttpRequest.newBuilder(todoListUri(name)) + .header("Accept", "application/json").GET().build(); try { final HttpResponse<String> response = HttpClient.newBuilder().build().send(request, HttpResponse.BodyHandlers.ofString()); @@ -93,11 +101,11 @@ public class RemoteTodoModelAccess implements TodoModelAccess { private void putTodoList(TodoList todoList) { try { String json = objectMapper.writeValueAsString(todoList); - HttpRequest request = HttpRequest.newBuilder(endpointBaseUri.resolve(URLEncoder.encode(todoList.getName(), StandardCharsets.UTF_8))) - .header("Accept", "application/json") - .header("Content-Type", "application/json") - .PUT(BodyPublishers.ofString(json)) - .build(); + HttpRequest request = HttpRequest.newBuilder(todoListUri(todoList.getName())) + .header("Accept", "application/json") + .header("Content-Type", "application/json") + .PUT(BodyPublishers.ofString(json)) + .build(); final HttpResponse<String> response = HttpClient.newBuilder().build().send(request, HttpResponse.BodyHandlers.ofString()); String responseString = response.body(); @@ -127,10 +135,10 @@ public class RemoteTodoModelAccess implements TodoModelAccess { */ public void removeTodoList(String name) { try { - HttpRequest request = HttpRequest.newBuilder(endpointBaseUri.resolve(URLEncoder.encode(name, StandardCharsets.UTF_8))) - .header("Accept", "application/json") - .DELETE() - .build(); + HttpRequest request = HttpRequest.newBuilder(todoListUri(name)) + .header("Accept", "application/json") + .DELETE() + .build(); final HttpResponse<String> response = HttpClient.newBuilder().build().send(request, HttpResponse.BodyHandlers.ofString()); String responseString = response.body(); @@ -151,11 +159,11 @@ public class RemoteTodoModelAccess implements TodoModelAccess { */ public void renameTodoList(String oldName, String newName) { try { - HttpRequest request = HttpRequest.newBuilder(endpointBaseUri.resolve(URLEncoder.encode(oldName, StandardCharsets.UTF_8))) - .header("Accept", "application/json") - .header("Content-Type", "application/x-www-form-urlencoded") - .POST(BodyPublishers.ofString("newName=" + URLEncoder.encode(newName, StandardCharsets.UTF_8))) - .build(); + HttpRequest request = HttpRequest.newBuilder(todoListUri(oldName)) + .header("Accept", "application/json") + .header("Content-Type", "application/x-www-form-urlencoded") + .POST(BodyPublishers.ofString("newName=" + uriParam(newName))) + .build(); final HttpResponse<String> response = HttpClient.newBuilder().build().send(request, HttpResponse.BodyHandlers.ofString()); String responseString = response.body(); diff --git a/todolist/fxui/src/main/java/todolist/ui/TodoAppController.java b/todolist/fxui/src/main/java/todolist/ui/TodoAppController.java index 19de8d49b5c4426e25abf20e79dd15d8f802389d..14f53e089db0577c49ee2d07cfd347ee39b11983 100644 --- a/todolist/fxui/src/main/java/todolist/ui/TodoAppController.java +++ b/todolist/fxui/src/main/java/todolist/ui/TodoAppController.java @@ -40,8 +40,8 @@ public class TodoAppController { // try to read file from home folder first if (userTodoModelPath != null) { try { - reader = new FileReader(Paths.get(System.getProperty("user.home"), userTodoModelPath).toFile(), - StandardCharsets.UTF_8); + reader = new FileReader(Paths.get(System.getProperty("user.home"), + userTodoModelPath).toFile(), StandardCharsets.UTF_8); } catch (IOException ioex) { System.err.println("Fant ingen " + userTodoModelPath + " på hjemmeområdet"); } @@ -80,7 +80,8 @@ public class TodoAppController { } if (todoModel == null) { todoModel = new TodoModel(); - TodoList todoList = new TodoList("Helgehandling", new TodoItem().text("Øl"), new TodoItem().text("Pizza")); + TodoList todoList = new TodoList("Helgehandling", new TodoItem().text("Øl"), + new TodoItem().text("Pizza")); todoModel.addTodoList(todoList); } return todoModel; diff --git a/todolist/fxui/src/main/java/todolist/ui/TodoModelController.java b/todolist/fxui/src/main/java/todolist/ui/TodoModelController.java index 0de7779dc5720d8c077faba2170f987e95c6562e..127fbfa0ebec8f466368c31f3efd415072c374fd 100644 --- a/todolist/fxui/src/main/java/todolist/ui/TodoModelController.java +++ b/todolist/fxui/src/main/java/todolist/ui/TodoModelController.java @@ -56,7 +56,7 @@ public class TodoModelController { } }); todoListsView.getSelectionModel().selectedIndexProperty().addListener((prop, oldIndex, newIndex) - -> { + -> { if (newIndex.intValue() == 0) { todoListsView.setValue(""); } else { diff --git a/todolist/restapi/src/main/java/todolist/restapi/TodoListResource.java b/todolist/restapi/src/main/java/todolist/restapi/TodoListResource.java index 850234b5fc4ac8e1b32c663013a5448a70c986db..add28c6d9b2bfe8555ab2d6340e284f14ed7bc96 100644 --- a/todolist/restapi/src/main/java/todolist/restapi/TodoListResource.java +++ b/todolist/restapi/src/main/java/todolist/restapi/TodoListResource.java @@ -41,6 +41,11 @@ public class TodoListResource { } } + /** + * Gets the corresponding TodoList. + * + * @return the corresponding TodoList + */ @GET @Produces(MediaType.APPLICATION_JSON) public TodoList getTodoList() { diff --git a/todolist/restserver/src/main/java/todolist/restserver/TodoConfig.java b/todolist/restserver/src/main/java/todolist/restserver/TodoConfig.java index f01ab81072b3aecbe6838e1488fc598eec1bfd8c..01720359248511be3a06a50c5d27484b9203608f 100644 --- a/todolist/restserver/src/main/java/todolist/restserver/TodoConfig.java +++ b/todolist/restserver/src/main/java/todolist/restserver/TodoConfig.java @@ -3,6 +3,8 @@ package todolist.restserver; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; import java.nio.charset.StandardCharsets; import org.glassfish.hk2.utilities.binding.AbstractBinder; import org.glassfish.jersey.jackson.JacksonFeature; @@ -51,11 +53,14 @@ public class TodoConfig extends ResourceConfig { private static TodoModel createDefaultTodoModel() { TodoPersistence todoPersistence = new TodoPersistence(); - try (InputStream input = TodoConfig.class.getResourceAsStream("default-todomodel.json")) { - return todoPersistence.readTodoModel(new InputStreamReader(input, StandardCharsets.UTF_8)); - } catch (IOException e) { - System.out.println("Couldn't read default-todomodel.json, so rigging TodoModel manually (" - + e + ")"); + URL url = TodoConfig.class.getResource("default-todomodel.json"); + if (url != null) { + try (Reader reader = new InputStreamReader(url.openStream(), StandardCharsets.UTF_8)) { + return todoPersistence.readTodoModel(reader); + } catch (IOException e) { + System.out.println("Couldn't read default-todomodel.json, so rigging TodoModel manually (" + + e + ")"); + } } TodoModel todoModel = new TodoModel(); todoModel.addTodoList(new TodoList("todo1"));