package com.metservice.kanban;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import com.google.common.base.Preconditions;
import com.metservice.kanban.model.WorkItem;
import com.metservice.kanban.model.WorkItemComment;
import com.metservice.kanban.model.WorkItemTree;
// TODO This class needs unit tests.
public class KanbanCommentsFile {
private File file;
private Map<Integer, List<WorkItemComment>> completeCommentsList;
public KanbanCommentsFile(File file) throws IOException {
this.file = file;
if (this.file.createNewFile()) {
performWrite(new HashMap<Integer, List<WorkItemComment>>());
}
}
public void writeAllComments(WorkItemTree workItems) throws IOException {
completeCommentsList = new HashMap<Integer, List<WorkItemComment>>();
for (WorkItem workItem : workItems.getWorkItemList()) {
completeCommentsList.put(workItem.getId(), workItem.getComments());
}
performWrite(completeCommentsList);
}
private void performWrite(Map<Integer, List<WorkItemComment>> mapToWrite) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
try {
oos.writeObject(mapToWrite);
} finally {
IOUtils.closeQuietly(oos);
}
}
@SuppressWarnings("unchecked")
public void readAllComments() throws IOException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
try {
completeCommentsList = (Map<Integer, List<WorkItemComment>>) ois.readObject();
} catch (ClassNotFoundException e) {
throw new AssertionError(e);
} finally {
IOUtils.closeQuietly(ois);
}
}
public List<WorkItemComment> getCommentsFor(int id) {
Preconditions.checkState(completeCommentsList != null,
"Can not get comments before reading them for the first time. Call readAllComments() first.");
return completeCommentsList.get(id);
}
}