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; ...@@ -9,6 +9,8 @@ import java.util.stream.Collectors;
public class TodoList implements Iterable<TodoItem> { public class TodoList implements Iterable<TodoItem> {
private String name;
private List<TodoItem> items = new ArrayList<>(); private List<TodoItem> items = new ArrayList<>();
private LocalDateTime deadline; private LocalDateTime deadline;
...@@ -17,6 +19,14 @@ public class TodoList implements Iterable<TodoItem> { ...@@ -17,6 +19,14 @@ public class TodoList implements Iterable<TodoItem> {
addTodoItems(items); addTodoItems(items);
} }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public LocalDateTime getDeadline() { public LocalDateTime getDeadline() {
return deadline; 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> { ...@@ -25,9 +25,17 @@ class TodoListDeserializer extends JsonDeserializer<TodoList> {
public TodoList deserialize(JsonParser parser, DeserializationContext ctxt) public TodoList deserialize(JsonParser parser, DeserializationContext ctxt)
throws IOException, JsonProcessingException { throws IOException, JsonProcessingException {
TreeNode treeNode = parser.getCodec().readTree(parser); TreeNode treeNode = parser.getCodec().readTree(parser);
return deserialize((JsonNode) treeNode);
}
TodoList deserialize(JsonNode treeNode) {
if (treeNode instanceof ObjectNode) { if (treeNode instanceof ObjectNode) {
ObjectNode objectNode = (ObjectNode) treeNode; ObjectNode objectNode = (ObjectNode) treeNode;
TodoList list = new TodoList(); TodoList list = new TodoList();
JsonNode nameNode = objectNode.get("name");
if (nameNode instanceof TextNode) {
list.setName(nameNode.asText());
}
JsonNode deadlineNode = objectNode.get("deadline"); JsonNode deadlineNode = objectNode.get("deadline");
if (deadlineNode instanceof TextNode) { if (deadlineNode instanceof TextNode) {
list.setDeadline(LocalDateTime.parse(deadlineNode.asText())); list.setDeadline(LocalDateTime.parse(deadlineNode.asText()));
......
...@@ -10,13 +10,16 @@ import todolist.core.TodoList; ...@@ -10,13 +10,16 @@ import todolist.core.TodoList;
class TodoListSerializer extends JsonSerializer<TodoList> { class TodoListSerializer extends JsonSerializer<TodoList> {
/* /*
* format: { "items": [ ... ] } * format: { "name": "...", "items": [ ... ] }
*/ */
@Override @Override
public void serialize(TodoList list, JsonGenerator jsonGen, SerializerProvider serializerProvider) public void serialize(TodoList list, JsonGenerator jsonGen, SerializerProvider serializerProvider)
throws IOException { throws IOException {
jsonGen.writeStartObject(); jsonGen.writeStartObject();
if (list.getName() != null) {
jsonGen.writeStringField("name", list.getName());
}
if (list.getDeadline() != null) { if (list.getDeadline() != null) {
jsonGen.writeStringField("deadline", list.getDeadline().toString()); 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; ...@@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.module.SimpleModule;
import todolist.core.TodoItem; import todolist.core.TodoItem;
import todolist.core.TodoList; import todolist.core.TodoList;
import todolist.core.TodoModel;
@SuppressWarnings("serial") @SuppressWarnings("serial")
class TodoModule extends SimpleModule { class TodoModule extends SimpleModule {
...@@ -17,7 +18,9 @@ class TodoModule extends SimpleModule { ...@@ -17,7 +18,9 @@ class TodoModule extends SimpleModule {
super(NAME, Version.unknownVersion()); super(NAME, Version.unknownVersion());
addSerializer(TodoItem.class, new TodoItemSerializer()); addSerializer(TodoItem.class, new TodoItemSerializer());
addSerializer(TodoList.class, new TodoListSerializer()); addSerializer(TodoList.class, new TodoListSerializer());
addSerializer(TodoModel.class, new TodoModelSerializer());
addDeserializer(TodoItem.class, new TodoItemDeserializer()); addDeserializer(TodoItem.class, new TodoItemDeserializer());
addDeserializer(TodoList.class, new TodoListDeserializer()); addDeserializer(TodoList.class, new TodoListDeserializer());
addDeserializer(TodoModel.class, new TodoModelDeserializer());
} }
} }
...@@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; ...@@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException; import java.io.IOException;
import java.io.Reader; import java.io.Reader;
import java.io.Writer; import java.io.Writer;
import todolist.core.TodoList; import todolist.core.TodoModel;
public class TodoPersistence { public class TodoPersistence {
...@@ -15,11 +15,11 @@ public class TodoPersistence { ...@@ -15,11 +15,11 @@ public class TodoPersistence {
mapper.registerModule(new TodoModule()); mapper.registerModule(new TodoModule());
} }
public TodoList readTodoList(Reader reader) throws IOException { public TodoModel readTodoModel(Reader reader) throws IOException {
return mapper.readValue(reader, TodoList.class); return mapper.readValue(reader, TodoModel.class);
} }
public void writeTodoList(TodoList todoList, Writer writer) throws IOException { public void writeTodoModel(TodoModel todoModel, Writer writer) throws IOException {
mapper.writerWithDefaultPrettyPrinter().writeValue(writer, todoList); mapper.writerWithDefaultPrettyPrinter().writeValue(writer, todoModel);
} }
} }
...@@ -12,10 +12,11 @@ import org.junit.jupiter.api.BeforeAll; ...@@ -12,10 +12,11 @@ import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import todolist.core.TodoItem; import todolist.core.TodoItem;
import todolist.core.TodoList; import todolist.core.TodoList;
import todolist.core.TodoModel;
public class TodoModuleTest { 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; private static ObjectMapper mapper;
...@@ -25,11 +26,14 @@ public class TodoModuleTest { ...@@ -25,11 +26,14 @@ public class TodoModuleTest {
mapper.registerModule(new TodoModule()); 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 @Test
public void testSerializers() { public void testSerializers() {
TodoModel model = new TodoModel();
TodoList list = new TodoList(); TodoList list = new TodoList();
list.setName("todo");
model.addTodoList(list);
TodoItem item1 = list.createTodoItem(); TodoItem item1 = list.createTodoItem();
item1.setText("item1"); item1.setText("item1");
TodoItem item2 = list.createTodoItem(); TodoItem item2 = list.createTodoItem();
...@@ -39,7 +43,7 @@ public class TodoModuleTest { ...@@ -39,7 +43,7 @@ public class TodoModuleTest {
list.addTodoItem(item1); list.addTodoItem(item1);
list.addTodoItem(item2); list.addTodoItem(item2);
try { try {
assertEquals(todoListWithTwoItems.replaceAll("\\s+", ""), mapper.writeValueAsString(list)); assertEquals(todoListWithTwoItems.replaceAll("\\s+", ""), mapper.writeValueAsString(model));
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
fail(); fail();
} }
...@@ -58,7 +62,10 @@ public class TodoModuleTest { ...@@ -58,7 +62,10 @@ public class TodoModuleTest {
@Test @Test
public void testDeserializers() { public void testDeserializers() {
try { 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(); Iterator<TodoItem> it = list.iterator();
assertTrue(it.hasNext()); assertTrue(it.hasNext());
checkTodoItem(it.next(), "item1", false, null); checkTodoItem(it.next(), "item1", false, null);
...@@ -72,7 +79,10 @@ public class TodoModuleTest { ...@@ -72,7 +79,10 @@ public class TodoModuleTest {
@Test @Test
public void testSerializersDeserializers() { public void testSerializersDeserializers() {
TodoModel model = new TodoModel();
TodoList list = new TodoList(); TodoList list = new TodoList();
list.setName("todo");
model.addTodoList(list);
TodoItem item1 = new TodoItem(); TodoItem item1 = new TodoItem();
item1.setText("item1"); item1.setText("item1");
TodoItem item2 = new TodoItem(); TodoItem item2 = new TodoItem();
...@@ -82,8 +92,11 @@ public class TodoModuleTest { ...@@ -82,8 +92,11 @@ public class TodoModuleTest {
list.addTodoItem(item1); list.addTodoItem(item1);
list.addTodoItem(item2); list.addTodoItem(item2);
try { try {
String json = mapper.writeValueAsString(list); String json = mapper.writeValueAsString(model);
TodoList list2 = mapper.readValue(json, TodoList.class); 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(); Iterator<TodoItem> it = list2.iterator();
assertTrue(it.hasNext()); assertTrue(it.hasNext());
checkTodoItem(it.next(), item1); checkTodoItem(it.next(), item1);
......
package todolist.json; 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.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.Assertions.fail;
...@@ -11,6 +12,7 @@ import java.util.Iterator; ...@@ -11,6 +12,7 @@ import java.util.Iterator;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import todolist.core.TodoItem; import todolist.core.TodoItem;
import todolist.core.TodoList; import todolist.core.TodoList;
import todolist.core.TodoModel;
public class TodoPersistenceTest { public class TodoPersistenceTest {
...@@ -18,7 +20,10 @@ public class TodoPersistenceTest { ...@@ -18,7 +20,10 @@ public class TodoPersistenceTest {
@Test @Test
public void testSerializersDeserializers() { public void testSerializersDeserializers() {
TodoModel model = new TodoModel();
TodoList list = new TodoList(); TodoList list = new TodoList();
list.setName("todo");
model.addTodoList(list);
TodoItem item1 = new TodoItem(); TodoItem item1 = new TodoItem();
item1.setText("item1"); item1.setText("item1");
list.addTodoItem(item1); list.addTodoItem(item1);
...@@ -29,9 +34,12 @@ public class TodoPersistenceTest { ...@@ -29,9 +34,12 @@ public class TodoPersistenceTest {
list.addTodoItem(item2); list.addTodoItem(item2);
try { try {
StringWriter writer = new StringWriter(); StringWriter writer = new StringWriter();
todoPersistence.writeTodoList(list, writer); todoPersistence.writeTodoModel(model, writer);
String json = writer.toString(); 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(); Iterator<TodoItem> it = list2.iterator();
assertTrue(it.hasNext()); assertTrue(it.hasNext());
TodoModuleTest.checkTodoItem(it.next(), item1); 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