Skip to content
Snippets Groups Projects
Commit 8e00b1ec authored by Hallvard Trætteberg's avatar Hallvard Trætteberg
Browse files

Konflikter håndtert

parents 02f2108c e8915f1e
No related branches found
No related tags found
No related merge requests found
Showing
with 155 additions and 14 deletions
......@@ -9,6 +9,8 @@ import java.util.stream.Collectors;
public class TodoList implements Iterable<TodoItem> {
private String name;
private List<TodoItem> items = new ArrayList<>();
private LocalDateTime deadline;
......@@ -17,6 +19,14 @@ public class TodoList implements Iterable<TodoItem> {
addTodoItems(items);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public LocalDateTime getDeadline() {
return deadline;
}
......
package todolist.core;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class TodoModel implements Iterable<TodoList> {
private Collection<TodoList> todoLists = new ArrayList<>();
public void addTodoList(TodoList list) {
todoLists.add(list);
}
public void removeTodoList(TodoList list) {
todoLists.remove(list);
}
@Override
public Iterator<TodoList> iterator() {
return todoLists.iterator();
}
}
......@@ -25,9 +25,17 @@ class TodoListDeserializer extends JsonDeserializer<TodoList> {
public TodoList deserialize(JsonParser parser, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
TreeNode treeNode = parser.getCodec().readTree(parser);
return deserialize((JsonNode) treeNode);
}
TodoList deserialize(JsonNode treeNode) {
if (treeNode instanceof ObjectNode) {
ObjectNode objectNode = (ObjectNode) treeNode;
TodoList list = new TodoList();
JsonNode nameNode = objectNode.get("name");
if (nameNode instanceof TextNode) {
list.setName(nameNode.asText());
}
JsonNode deadlineNode = objectNode.get("deadline");
if (deadlineNode instanceof TextNode) {
list.setDeadline(LocalDateTime.parse(deadlineNode.asText()));
......
......@@ -10,13 +10,16 @@ import todolist.core.TodoList;
class TodoListSerializer extends JsonSerializer<TodoList> {
/*
* format: { "items": [ ... ] }
* format: { "name": "...", "items": [ ... ] }
*/
@Override
public void serialize(TodoList list, JsonGenerator jsonGen, SerializerProvider serializerProvider)
throws IOException {
jsonGen.writeStartObject();
if (list.getName() != null) {
jsonGen.writeStringField("name", list.getName());
}
if (list.getDeadline() != null) {
jsonGen.writeStringField("deadline", list.getDeadline().toString());
}
......
package todolist.json;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.TreeNode;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.IOException;
import todolist.core.TodoList;
import todolist.core.TodoModel;
class TodoModelDeserializer extends JsonDeserializer<TodoModel> {
private TodoListDeserializer todoListDeserializer = new TodoListDeserializer();
/*
* format: { "lists": [ ... ] }
*/
@Override
public TodoModel deserialize(JsonParser parser, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
TreeNode treeNode = parser.getCodec().readTree(parser);
return deserialize((JsonNode) treeNode);
}
TodoModel deserialize(JsonNode treeNode) {
if (treeNode instanceof ObjectNode) {
ObjectNode objectNode = (ObjectNode) treeNode;
TodoModel model = new TodoModel();
JsonNode itemsNode = objectNode.get("lists");
if (itemsNode instanceof ArrayNode) {
for (JsonNode elementNode : ((ArrayNode) itemsNode)) {
TodoList list = todoListDeserializer.deserialize(elementNode);
if (list != null) {
model.addTodoList(list);
}
}
}
return model;
}
return null;
}
}
\ No newline at end of file
package todolist.json;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import todolist.core.TodoList;
import todolist.core.TodoModel;
class TodoModelSerializer extends JsonSerializer<TodoModel> {
/*
* format: { "lists": [ ... ] }
*/
@Override
public void serialize(TodoModel model, JsonGenerator jsonGen, SerializerProvider serializerProvider)
throws IOException {
jsonGen.writeStartObject();
jsonGen.writeArrayFieldStart("lists");
for (TodoList list : model) {
jsonGen.writeObject(list);
}
jsonGen.writeEndArray();
jsonGen.writeEndObject();
}
}
\ No newline at end of file
......@@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.databind.module.SimpleModule;
import todolist.core.TodoItem;
import todolist.core.TodoList;
import todolist.core.TodoModel;
@SuppressWarnings("serial")
class TodoModule extends SimpleModule {
......@@ -17,7 +18,9 @@ class TodoModule extends SimpleModule {
super(NAME, Version.unknownVersion());
addSerializer(TodoItem.class, new TodoItemSerializer());
addSerializer(TodoList.class, new TodoListSerializer());
addSerializer(TodoModel.class, new TodoModelSerializer());
addDeserializer(TodoItem.class, new TodoItemDeserializer());
addDeserializer(TodoList.class, new TodoListDeserializer());
addDeserializer(TodoModel.class, new TodoModelDeserializer());
}
}
......@@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import todolist.core.TodoList;
import todolist.core.TodoModel;
public class TodoPersistence {
......@@ -15,11 +15,11 @@ public class TodoPersistence {
mapper.registerModule(new TodoModule());
}
public TodoList readTodoList(Reader reader) throws IOException {
return mapper.readValue(reader, TodoList.class);
public TodoModel readTodoModel(Reader reader) throws IOException {
return mapper.readValue(reader, TodoModel.class);
}
public void writeTodoList(TodoList todoList, Writer writer) throws IOException {
mapper.writerWithDefaultPrettyPrinter().writeValue(writer, todoList);
public void writeTodoModel(TodoModel todoModel, Writer writer) throws IOException {
mapper.writerWithDefaultPrettyPrinter().writeValue(writer, todoModel);
}
}
......@@ -12,10 +12,11 @@ import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import todolist.core.TodoItem;
import todolist.core.TodoList;
import todolist.core.TodoModel;
public class TodoModuleTest {
// {"items":[{"text":"item1","checked":false},{"text":"item2","checked":true}]}
// {"lists":[{"name": "todo", "items":[{"text":"item1","checked":false},{"text":"item2","checked":true}]}]}
private static ObjectMapper mapper;
......@@ -25,11 +26,14 @@ public class TodoModuleTest {
mapper.registerModule(new TodoModule());
}
private final static String todoListWithTwoItems = "{\"items\":[{\"text\":\"item1\",\"checked\":false},{\"text\":\"item2\",\"checked\":true,\"deadline\":\"2020-10-01T14:53:11\"}]}";
private final static String todoListWithTwoItems = "{\"lists\":[{\"name\":\"todo\",\"items\":[{\"text\":\"item1\",\"checked\":false},{\"text\":\"item2\",\"checked\":true,\"deadline\":\"2020-10-01T14:53:11\"}]}]}";
@Test
public void testSerializers() {
TodoModel model = new TodoModel();
TodoList list = new TodoList();
list.setName("todo");
model.addTodoList(list);
TodoItem item1 = list.createTodoItem();
item1.setText("item1");
TodoItem item2 = list.createTodoItem();
......@@ -39,7 +43,7 @@ public class TodoModuleTest {
list.addTodoItem(item1);
list.addTodoItem(item2);
try {
assertEquals(todoListWithTwoItems.replaceAll("\\s+", ""), mapper.writeValueAsString(list));
assertEquals(todoListWithTwoItems.replaceAll("\\s+", ""), mapper.writeValueAsString(model));
} catch (JsonProcessingException e) {
fail();
}
......@@ -58,7 +62,10 @@ public class TodoModuleTest {
@Test
public void testDeserializers() {
try {
TodoList list = mapper.readValue(todoListWithTwoItems, TodoList.class);
TodoModel model = mapper.readValue(todoListWithTwoItems, TodoModel.class);
assertTrue(model.iterator().hasNext());
TodoList list = model.iterator().next();
assertEquals("todo", list.getName());
Iterator<TodoItem> it = list.iterator();
assertTrue(it.hasNext());
checkTodoItem(it.next(), "item1", false, null);
......@@ -72,7 +79,10 @@ public class TodoModuleTest {
@Test
public void testSerializersDeserializers() {
TodoModel model = new TodoModel();
TodoList list = new TodoList();
list.setName("todo");
model.addTodoList(list);
TodoItem item1 = new TodoItem();
item1.setText("item1");
TodoItem item2 = new TodoItem();
......@@ -82,8 +92,11 @@ public class TodoModuleTest {
list.addTodoItem(item1);
list.addTodoItem(item2);
try {
String json = mapper.writeValueAsString(list);
TodoList list2 = mapper.readValue(json, TodoList.class);
String json = mapper.writeValueAsString(model);
TodoModel model2 = mapper.readValue(json, TodoModel.class);
assertTrue(model2.iterator().hasNext());
TodoList list2 = model.iterator().next();
assertEquals("todo", list.getName());
Iterator<TodoItem> it = list2.iterator();
assertTrue(it.hasNext());
checkTodoItem(it.next(), item1);
......
package todolist.json;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
......@@ -11,6 +12,7 @@ import java.util.Iterator;
import org.junit.jupiter.api.Test;
import todolist.core.TodoItem;
import todolist.core.TodoList;
import todolist.core.TodoModel;
public class TodoPersistenceTest {
......@@ -18,7 +20,10 @@ public class TodoPersistenceTest {
@Test
public void testSerializersDeserializers() {
TodoModel model = new TodoModel();
TodoList list = new TodoList();
list.setName("todo");
model.addTodoList(list);
TodoItem item1 = new TodoItem();
item1.setText("item1");
list.addTodoItem(item1);
......@@ -29,9 +34,12 @@ public class TodoPersistenceTest {
list.addTodoItem(item2);
try {
StringWriter writer = new StringWriter();
todoPersistence.writeTodoList(list, writer);
todoPersistence.writeTodoModel(model, writer);
String json = writer.toString();
TodoList list2 = todoPersistence.readTodoList(new StringReader(json));
TodoModel model2 = todoPersistence.readTodoModel(new StringReader(json));
assertTrue(model2.iterator().hasNext());
TodoList list2 = model.iterator().next();
assertEquals("todo", list.getName());
Iterator<TodoItem> it = list2.iterator();
assertTrue(it.hasNext());
TodoModuleTest.checkTodoItem(it.next(), item1);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment