package com.anjlab.ping.services;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import com.anjlab.ping.entities.JobResult;
public class JobResultCSVImporter {
private interface ValueSetter<T, V> {
public void setValue(T instance, V value);
}
private Map<String, ValueSetter<JobResult, String>> valueSetters;
public JobResultCSVImporter(TimeZone timeZone) {
initValueSetters(timeZone);
}
private void initValueSetters(final TimeZone timeZone) {
valueSetters = new HashMap<String, ValueSetter<JobResult, String>>();
valueSetters.put("timestamp", new ValueSetter<JobResult, String>() {
private DateFormat format;
{
format = (DateFormat) Application.DATETIME_FORMAT.clone();
if (timeZone != null) {
format.setTimeZone(timeZone);
}
}
@Override
public void setValue(JobResult instance, String value) {
try {
instance.setTimestamp(format.parse(value));
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
});
valueSetters.put("duration", new ValueSetter<JobResult, String>() {
@Override
public void setValue(JobResult instance, String value) {
instance.setResponseTime(Integer.parseInt(value));
}
});
valueSetters.put("resultCode", new ValueSetter<JobResult, String>() {
@Override
public void setValue(JobResult instance, String value) {
instance.setPingResult(Integer.parseInt(value));
}
});
valueSetters.put("httpResponseCode", new ValueSetter<JobResult, String>() {
@Override
public void setValue(JobResult instance, String value) {
instance.setHTTPResponseCode(Integer.parseInt(value));
}
});
}
public List<JobResult> fromStream(InputStream is) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = reader.readLine();
String[] headers = line.split(JobResultCSVExporter.SEPARATOR_CHAR + "");
List<JobResult> results = new ArrayList<JobResult>();
while ((line = reader.readLine()) != null) {
JobResult result = new JobResult();
String[] values = line.split(JobResultCSVExporter.SEPARATOR_CHAR + "");
for (int i = 0; i < values.length; i++) {
valueSetters.get(headers[i]).setValue(result, values[i]);
}
results.add(result);
}
return results;
}
}