package edu.sc.seis.sod.source;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import org.w3c.dom.Element;
import com.csvreader.CsvReader;
import edu.iris.Fissures.Time;
import edu.iris.Fissures.model.ISOTime;
import edu.iris.Fissures.model.UnitImpl;
import edu.iris.Fissures.model.UnsupportedFormat;
import edu.sc.seis.sod.ConfigurationException;
import edu.sc.seis.sod.UserConfigurationException;
public abstract class AbstractCSVSource extends AbstractSource {
public AbstractCSVSource(Element config, String defaultName) {
super(config, defaultName);
}
public AbstractCSVSource(String name) {
super(name);
}
public static final String LONGITUDE = "longitude";
public static final String LATITUDE = "latitude";
public static final String ELEVATION = "elevation";
public static final String DEPTH = "depth";
public static final String NAME = "name";
public static final String FE_SEIS_REGION = "flinnEngdahlSeismicRegion";
public abstract String[] getFields();
public boolean isValidField(String field) {
String[] fields = getFields();
for (int i = 0; i < fields.length; i++) {
if (field.equals(fields[i])) {
return true;
}
}
return false;
}
public String concatenateValidFields() {
String[] fields = getFields();
String allFields = "";
for (int i = 0; i < fields.length - 1; i++) {
allFields += fields[i] + ", ";
}
return allFields + fields[fields.length - 1];
}
public static final String FE_GEO_REGION = "flinnEngdahlGeographicRegion";
public static final String FE_REGION = "flinnEngdahlRegion";
public static final String FE_REGION_TYPE = "flinnEngdahlRegionType";
public static final String DEPTH_UNITS = "depthUnits";
public static final String ELEVATION_UNITS = "elevationUnits";
public static final String UNKNOWN = "unknown";
public static final Time DEFAULT_TIME = new Time("1970-01-01T00:00:00Z", 0);
public static final Time DEFAULT_END = edu.iris.Fissures.model.TimeUtils.timeUnknown;
public List<String> validateHeaders(CsvReader csvReader) throws IOException, FileNotFoundException,
ConfigurationException {
csvReader.readHeaders();
List<String> headers = Arrays.asList(csvReader.getHeaders());
for (int i = 0; i < headers.size(); i++) {
String cur = (String)headers.get(i);
if (!isValidField(cur)) {
throw new UserConfigurationException(cur + " is not a known CSV field. " + concatenateValidFields()
+ " are valid options.");
}
}
return headers;
}
public static float loadFloat(List<String> headers, CsvReader csvReader, String headerName, float defaultValue)
throws UserConfigurationException, IOException {
if (headers.contains(headerName)) {
try {
return Float.parseFloat(csvReader.get(headerName));
} catch (NumberFormatException e) {
throw new UserConfigurationException(csvReader.get(headerName) + " in record " + csvReader.getCurrentRecord()
+ ", column "+headerName+ " is not a valid float.");
}
}
return defaultValue;
}
public static double loadDouble(List<String> headers, CsvReader csvReader, String headerName, double defaultValue)
throws UserConfigurationException, IOException {
if (headers.contains(headerName)) {
try {
return Double.parseDouble(csvReader.get(headerName));
} catch (NumberFormatException e) {
throw new UserConfigurationException(csvReader.get(headerName) + " in record " + csvReader.getCurrentRecord()
+ ", column "+headerName+ " is not a valid double.");
}
}
return defaultValue;
}
public static String loadString(List<String> headers, CsvReader csvReader, String headerName, String defaultValue)
throws UserConfigurationException, IOException {
if (headers.contains(headerName)) {
return csvReader.get(headerName);
}
return defaultValue;
}
public static UnitImpl loadUnit(List<String> headers, CsvReader csvReader, String headerName, UnitImpl defaultUnit)
throws UserConfigurationException, IOException {
if (headers.contains(headerName)) {
String unitName = csvReader.get(headerName);
try {
return UnitImpl.getUnitFromString(unitName);
} catch(NoSuchFieldException e) {
throw new UserConfigurationException(unitName + " in record " + csvReader.getCurrentRecord()
+ ", column "+headerName+ " is not a valid unit name. Try KILOMETER or METER");
}
}
return defaultUnit;
}
public static Time loadTime(List<String> headers, CsvReader csvReader, String headerName, Time defaultTime)
throws UserConfigurationException, IOException {
if(headers.contains(headerName)) {
Time time = new Time(csvReader.get(headerName), 0);
try {
new ISOTime(time.date_time);
} catch(UnsupportedFormat uf) {
throw new UserConfigurationException("The time '"
+ time.date_time + "' in record "
+ csvReader.getCurrentRecord() + ", column "+headerName+" is invalid.");
}
}
return defaultTime;
}
protected String csvFilename;}