package com.anjlab.ping.services;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.TimeZone;
import com.anjlab.ping.entities.JobResult;
public class JobResultCSVExporter {
public static final char SEPARATOR_CHAR = ';';
public static final String[] COLUMN_HEADERS = {
"timestamp",
"duration",
"resultCode",
"httpResponseCode"
};
public static final String[] COLUMN_HEADER_PATTERNS = {
Application.DATETIME_PATTERN,
"99999",
"00",
"000"
};
private static final String HEADER_TEXT = getHeaderText();
private static String getHeaderText() {
StringBuffer buffer = new StringBuffer();
for (String column : COLUMN_HEADERS) {
if (buffer.length() > 0) {
buffer.append(SEPARATOR_CHAR);
}
buffer.append(column);
}
buffer.append('\n');
return buffer.toString();
}
private static final String HEADER_PATTERN = getHeaderPattern();
private static String getHeaderPattern() {
StringBuffer buffer = new StringBuffer();
for (String pattern : COLUMN_HEADER_PATTERNS) {
if (buffer.length() > 0) {
buffer.append(SEPARATOR_CHAR);
}
buffer.append(pattern);
}
buffer.append('\n');
return buffer.toString();
}
public static byte[] export(TimeZone timeZone, List<JobResult> results) throws IOException {
DateFormat dateFormat = Application.DATETIME_FORMAT;
ByteArrayOutputStream baos = new ByteArrayOutputStream(
HEADER_TEXT.length() + results.size() * HEADER_PATTERN.length());
write(baos, HEADER_TEXT);
Calendar c = Calendar.getInstance();
if (timeZone != null) {
dateFormat.setTimeZone(timeZone);
}
for (JobResult result : results) {
c.setTime(result.getTimestamp());
write(baos, dateFormat.format(c.getTime()));
write(baos, SEPARATOR_CHAR);
write(baos, result.getResponseTime());
write(baos, SEPARATOR_CHAR);
write(baos, result.getPingResult());
write(baos, SEPARATOR_CHAR);
write(baos, result.getHTTPResponseCode());
write(baos, '\n');
}
return baos.toByteArray();
}
private static void write(OutputStream output, String s) throws IOException {
output.write(s.getBytes());
}
private static void write(OutputStream output, char c) throws IOException {
output.write(String.valueOf(c).getBytes());
}
private static void write(OutputStream output, int i) throws IOException {
output.write(String.valueOf(i).getBytes());
}
}