package org.gcube.data_catalogue.grsf_publish_ws.utils; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.util.List; import org.gcube.data_catalogue.grsf_publish_ws.json.input.TimeSeriesBean; import org.slf4j.LoggerFactory; /** * Convert lists to csv format helpers * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) */ public class CSVHelpers { private static final org.slf4j.Logger logger = LoggerFactory.getLogger(CSVHelpers.class); private static final String CSV_SEPARATOR = ","; private static final String UPLOAD_LOCATION_LOCAL = System.getProperty("java.io.tmpdir"); private static final String GRSF_SUB_PATH = "GRSF_TIME_SERIES"; public static final String CSV_EXTENSION = ".csv"; private static final String YEAR_FIELD = "year"; private static final String VALUE_FIELD = "value"; private static final String UNIT_FIELD = "unit"; /** * Write a time series to a csv file, and returns the file reference.
* Please give the timeSeries already sorted per year * @param timeSeries * @param * @param */ public static File listToCSV(List> timeSeries){ if(timeSeries == null || timeSeries.isEmpty()){ logger.warn("The time series provided is null or empty ... " + timeSeries ); return null; }else try{ String fileName = UPLOAD_LOCATION_LOCAL + File.separator + GRSF_SUB_PATH + File.separator + "time_series_" + System.currentTimeMillis() + CSV_EXTENSION; File file = new File(fileName); file.getParentFile().mkdirs(); file.createNewFile(); FileOutputStream fo = new FileOutputStream(file); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fo, "UTF-8")); boolean isUnitPresent = false; StringBuffer headerLine = new StringBuffer(); headerLine.append(YEAR_FIELD); headerLine.append(CSV_SEPARATOR); headerLine.append(VALUE_FIELD); // first line is csv header, check the type of object if(timeSeries.get(0).getUnit() != null && !timeSeries.get(0).getUnit().getClass().equals(Void.class)){ isUnitPresent = true; headerLine.append(CSV_SEPARATOR); headerLine.append(UNIT_FIELD); } bw.write(headerLine.toString()); bw.newLine(); bw.flush(); // now iterate over the rows.. they are already sorted in ascending order for (TimeSeriesBean bean : timeSeries) { StringBuffer oneLine = new StringBuffer(); oneLine.append(bean.getYear()); oneLine.append(CSV_SEPARATOR); oneLine.append(bean.getValue()); if(isUnitPresent){ oneLine.append(CSV_SEPARATOR); oneLine.append(bean.getUnit() != null? bean.getUnit() : ""); } bw.write(oneLine.toString()); bw.newLine(); } bw.flush(); bw.close(); // file created logger.debug("CSV file created correctly on this machine!"); // on exit delete it... file.deleteOnExit(); return file; } catch(Exception e){ logger.error("Failed to create csv file for time series", e); return null; } } }