/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.copier.portfolio.reader;
import java.io.InputStream;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opengamma.integration.copier.portfolio.rowparser.JodaBeanRowParser;
import com.opengamma.integration.copier.portfolio.rowparser.RowParser;
import com.opengamma.integration.copier.sheet.SheetFormat;
import com.opengamma.integration.copier.sheet.reader.SheetReader;
import com.opengamma.master.position.ManageablePosition;
import com.opengamma.master.position.ManageableTrade;
import com.opengamma.master.security.ManageableSecurity;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.tuple.ObjectsPair;
/**
* A simple portfolio reader assumes that the input sheet only contains one asset class, and may also be used as a base
* class for specific asset class loaders that follow this rule.
*/
public class SingleSheetSimplePositionReader extends SingleSheetPositionReader {
private static final Logger s_logger = LoggerFactory.getLogger(SingleSheetSimplePositionReader.class);
/*
* Load one or more parsers for different types of securities/trades/whatever here
*/
private RowParser _rowParser;
/*
* Specify column order and names here (optional, may be inferred from sheet headers instead)
*/
private String[] _columns;
public SingleSheetSimplePositionReader(SheetReader sheet, RowParser rowParser) {
super(sheet);
ArgumentChecker.notNull(rowParser, "rowParser");
_columns = getSheet().getColumns();
_rowParser = rowParser;
}
public SingleSheetSimplePositionReader(SheetReader sheet, String securityClass) {
this(sheet, JodaBeanRowParser.newJodaBeanRowParser(securityClass));
}
public SingleSheetSimplePositionReader(SheetFormat sheetFormat, InputStream inputStream, RowParser rowParser) {
this(SheetReader.newSheetReader(sheetFormat, inputStream), rowParser);
}
public SingleSheetSimplePositionReader(SheetFormat sheetFormat, InputStream inputStream, String securityClass) {
this(SheetReader.newSheetReader(sheetFormat, inputStream), securityClass);
}
public SingleSheetSimplePositionReader(String filename, RowParser rowParser) {
this(SheetReader.newSheetReader(filename), rowParser);
}
public SingleSheetSimplePositionReader(String filename, String securityClass) {
this(SheetReader.newSheetReader(filename), securityClass);
}
@Override
public ObjectsPair<ManageablePosition, ManageableSecurity[]> readNext() {
Map<String, String> row = getSheet().loadNextRow();
if (row == null) {
return null;
}
// Build the underlying security
ManageableSecurity[] securities = _rowParser.constructSecurity(row);
if (securities != null && securities.length > 0 && securities[0] != null) {
// Build the position and trade(s) using security[0] (underlying)
ManageablePosition position = _rowParser.constructPosition(row, securities[0]);
if (position != null) {
ManageableTrade trade = _rowParser.constructTrade(row, securities[0], position);
if (trade != null) {
position.addTrade(trade);
}
}
return ObjectsPair.of(position, securities);
} else {
s_logger.warn("Row parser was unable to construct a security from row " + row);
return ObjectsPair.of(null, null);
}
}
public String[] getColumns() {
return _columns;
}
@Override
public String[] getCurrentPath() {
return new String[0];
}
@Override
public void close() {
getSheet().close();
}
@Override
public String getPortfolioName() {
return null;
}
}