001package edu.pdx.cs.joy.grader.canvas; 002 003import com.opencsv.CSVWriter; 004import edu.pdx.cs.joy.grader.gradebook.Assignment; 005import edu.pdx.cs.joy.grader.gradebook.GradeBook; 006import edu.pdx.cs.joy.grader.gradebook.Student; 007 008import java.io.Writer; 009import java.util.ArrayList; 010import java.util.List; 011import java.util.function.Function; 012 013public class CanvasGradesCSVGenerator implements CanvasGradesCSVColumnNames { 014 private final Writer writer; 015 016 public CanvasGradesCSVGenerator(Writer writer) { 017 this.writer = writer; 018 } 019 020 public void generate(GradeBook book) { 021 CSVWriter csv = new CSVWriter(writer); 022 writeHeaderRow(book, csv); 023 writeManualPostingRow(book, csv); 024 writePossiblePointsRow(book, csv); 025 writeStudentRows(book, csv); 026 } 027 028 private void writeManualPostingRow(GradeBook book, CSVWriter csv) { 029 List<String> line = new ArrayList<>(); 030 line.add(""); // Student Name 031 line.add(""); // Login ID 032 line.add(""); // Section 033 034 addCellsForEachAssignment(book, line, assignment -> ""); 035 036 csv.writeNext(line.toArray(new String[0])); 037 } 038 039 private void writePossiblePointsRow(GradeBook book, CSVWriter csv) { 040 List<String> line = new ArrayList<>(); 041 line.add("Possible Points"); 042 line.add(""); // Login ID 043 line.add(""); // Section 044 045 addCellsForEachAssignment(book, line, this::getPossiblePoints); 046 047 csv.writeNext(line.toArray(new String[0])); 048 049 } 050 051 private String getPossiblePoints(Assignment assignment) { 052 return String.valueOf(assignment.getPoints()); 053 } 054 055 private void writeStudentRows(GradeBook book, CSVWriter csv) { 056 book.studentsStream().forEach(student -> writeStudentRow(book, student, csv)); 057 } 058 059 private void writeStudentRow(GradeBook book, Student student, CSVWriter csv) { 060 csv.writeNext(getStudentLine(book, student)); 061 } 062 063 private String[] getStudentLine(GradeBook book, Student student) { 064 return new String[] { 065 getStudentName(student), 066 student.getCanvasId(), 067 book.getSectionName(student.getEnrolledSection()) 068 }; 069 } 070 071 private String getStudentName(Student student) { 072 return student.getLastName() + ", " + student.getFirstName(); 073 } 074 075 private void writeHeaderRow(GradeBook book, CSVWriter csv) { 076 List<String> line = new ArrayList<>(); 077 line.add(STUDENT_COLUMN); 078 line.add(ID_COLUMN); 079 line.add(SECTION_COLUMN); 080 081 addCellsForEachAssignment(book, line, this::getAssignmentHeaderCell); 082 083 csv.writeNext(line.toArray(new String[0])); 084 } 085 086 private void addCellsForEachAssignment(GradeBook book, List<String> line, Function<Assignment, String> function) { 087 book.getAssignmentNames().stream().map(book::getAssignment).forEach(assignment -> { 088 line.add(function.apply(assignment)); 089 }); 090 } 091 092 private String getAssignmentHeaderCell(Assignment assignment) { 093 return assignment.getName() + " (" + assignment.getCanvasId() + ")" ; 094 } 095}