package com.metservice.kanban.csv; import java.io.IOException; import java.io.Reader; import java.util.ArrayList; import java.util.List; import au.com.bytecode.opencsv.CSVReader; import com.metservice.kanban.model.WorkItem; import com.metservice.kanban.model.WorkItemType; public class KanbanCsvReader { private final CSVReader csvReader; private final WorkItemParser workItemParser; public KanbanCsvReader(Reader reader, WorkItemType workItemType) { this(reader, new DefaultWorkItemParser(workItemType)); } public KanbanCsvReader(Reader reader, WorkItemParser workItemParser) { this.csvReader = new CSVReader(reader); this.workItemParser = workItemParser; } public List<WorkItem> read() throws IOException { CsvColumnNames columnNames = new CsvColumnNames(csvReader.readNext()); List<WorkItem> workItems = new ArrayList<WorkItem>(); int rowNumber = 0; String[] row = csvReader.readNext(); while (row != null) { WorkItem workItem = createWorkItemWrappingException(columnNames, rowNumber, row); workItems.add(workItem); row = csvReader.readNext(); rowNumber++; } return new ArrayList<WorkItem>(workItems); } private WorkItem createWorkItemWrappingException(CsvColumnNames columnNames, int rowNumber, String[] row) { try { return workItemParser.parseWorkItem(columnNames, row); } catch (RuntimeException e) { throw new RuntimeException("failed to create work item from row " + rowNumber, e); } } public void close() throws IOException { csvReader.close(); } public void closeQuietly() { try { csvReader.close(); } catch (Exception e) { } } }