ReportCSVHelper.java
package edu.ucsb.cs156.happiercows.helpers;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import edu.ucsb.cs156.happiercows.entities.ReportLine;
/*
* This code is based on
* <a href="https://bezkoder.com/spring-boot-download-csv-file/">https://bezkoder.com/spring-boot-download-csv-file/</a>
* and provides a way to serve up a CSV file containing information associated
* with an instructor report.
*/
public class ReportCSVHelper {
private ReportCSVHelper() {}
/**
* This method is a hack to avoid a jacoco issue; it isn't possible to
* exclude an individual method call from jacoco coverage, but we can
* exclude the entire method.
* @param out
*/
public static void flush_and_close_noPitest(ByteArrayOutputStream out, CSVPrinter csvPrinter) throws IOException {
csvPrinter.flush();
csvPrinter.close();
out.flush();
out.close();
}
public static ByteArrayInputStream toCSV(Iterable<ReportLine> lines) throws IOException {
final CSVFormat format = CSVFormat.DEFAULT;
List<String> headers = Arrays.asList(
"id",
"reportId",
"userId",
"username",
"totalWealth",
"numOfCows",
"avgCowHealth",
"cowsBought",
"cowsSold",
"cowDeaths",
"reportDate");
ByteArrayOutputStream out = new ByteArrayOutputStream();
CSVPrinter csvPrinter = new CSVPrinter(new PrintWriter(out), format);
csvPrinter.printRecord(headers);
for (ReportLine line : lines) {
List<String> data = Arrays.asList(
String.valueOf(line.getId()),
String.valueOf(line.getReportId()),
String.valueOf(line.getUserId()),
line.getUsername(),
String.valueOf(line.getTotalWealth()),
String.valueOf(line.getNumOfCows()),
String.valueOf(line.getAvgCowHealth()),
String.valueOf(line.getCowsBought()),
String.valueOf(line.getCowsSold()),
String.valueOf(line.getCowDeaths()),
String.valueOf(line.getCreateDate()));
csvPrinter.printRecord(data);
}
flush_and_close_noPitest(out, csvPrinter);
return new ByteArrayInputStream(out.toByteArray());
}
}