/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.copier.timeseries.reader;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.threeten.bp.LocalDate;
import org.threeten.bp.format.DateTimeFormatter;
import org.threeten.bp.format.DateTimeFormatterBuilder;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalScheme;
import com.opengamma.integration.copier.sheet.SheetFormat;
import com.opengamma.integration.copier.sheet.reader.SheetReader;
import com.opengamma.integration.copier.timeseries.TimeSeriesLoader;
import com.opengamma.integration.copier.timeseries.writer.TimeSeriesWriter;
import com.opengamma.timeseries.date.localdate.ImmutableLocalDateDoubleTimeSeries;
import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeriesBuilder;
/**
* Reads data points, possibly from multiple time series, from an single sheet
*/
public class SingleSheetMultiTimeSeriesReader implements TimeSeriesReader {
private static final Logger s_logger = LoggerFactory.getLogger(TimeSeriesLoader.class);
// private static final String ID_SCHEME = "TIME_SERIES_LOADER";
private static final int BUFFER_SIZE = 32;
// CSOFF
/** Standard date-time formatter for the input */
protected DateTimeFormatter CSV_DATE_FORMATTER;
private static final String ID = "id";
private static final String DATE = "date";
private static final String VALUE = "value";
// public static final String DATA_SOURCE = "data source";
// public static final String DATA_PROVIDER = "data provider";
// public static final String DATA_FIELD = "data field";
// public static final String OBSERVATION_TIME = "observation time";
// CSON
private SheetReader _sheet; // The spreadsheet from which to import
private String _dataSource, _dataProvider, _dataField, _observationTime, _idScheme;
public SingleSheetMultiTimeSeriesReader(SheetReader sheet,
String dataSource,
String dataProvider,
String dataField,
String observationTime,
String idScheme,
String dateFormat) {
_sheet = sheet;
_dataSource = dataSource;
_dataProvider = dataProvider;
_dataField = dataField;
_observationTime = observationTime;
_idScheme = idScheme;
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
builder.appendPattern(dateFormat == null ? "yyyyMMdd" : dateFormat);
CSV_DATE_FORMATTER = builder.toFormatter();
}
public SingleSheetMultiTimeSeriesReader(SheetFormat sheetFormat,
InputStream portfolioFileStream,
String dataSource,
String dataProvider,
String dataField,
String observationTime,
String idScheme,
String dateFormat) {
_sheet = SheetReader.newSheetReader(sheetFormat, portfolioFileStream);
_dataSource = dataSource;
_dataProvider = dataProvider;
_dataField = dataField;
_observationTime = observationTime;
_idScheme = idScheme;
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
builder.appendPattern(dateFormat == null ? "yyyyMMdd" : dateFormat);
CSV_DATE_FORMATTER = builder.toFormatter();
}
@Override
public void writeTo(TimeSeriesWriter timeSeriesWriter) {
Map<String, String> rawRow = null;
do {
Map<String, LocalDateDoubleTimeSeriesBuilder> tsData = new HashMap<String, LocalDateDoubleTimeSeriesBuilder>();
int count = 0;
// Get the next set of rows from the sheet up to the memory buffer limit
while ((count < BUFFER_SIZE) && ((rawRow = _sheet.loadNextRow()) != null)) { // CSIGNORE
try {
String ric = getWithException(rawRow, ID);
if (!tsData.containsKey(ric)) {
tsData.put(ric, ImmutableLocalDateDoubleTimeSeries.builder());
}
LocalDate date = getDateWithException(rawRow, DATE);
double value = Double.parseDouble(getWithException(rawRow, VALUE));
tsData.get(ric).put(date, value);
} catch (Throwable e) {
s_logger.warn("Could not parse time series row " + rawRow + "; " + e.toString());
}
count++;
}
// Write out the gathered time series points across all time series keys
for (String key : tsData.keySet()) {
if (tsData.get(key).size() > 0) {
s_logger.info("Writing " + tsData.get(key).size() + " data points to time series " + key);
timeSeriesWriter.writeDataPoints(
ExternalId.of(ExternalScheme.of(_idScheme), key),
_dataSource,
_dataProvider,
_dataField,
_observationTime,
tsData.get(key).build());
}
}
} while (rawRow != null);
}
protected String getWithException(Map<String, String> fieldValueMap, String fieldName) {
String result = fieldValueMap.get(fieldName);
if (result == null) {
System.err.println(fieldValueMap);
throw new IllegalArgumentException("Could not find field '" + fieldName + "'");
}
return result;
}
protected LocalDate getDateWithException(Map<String, String> fieldValueMap, String fieldName) {
return LocalDate.parse(getWithException(fieldValueMap, fieldName), CSV_DATE_FORMATTER);
}
}