/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.integration.copier.portfolio.writer; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import org.joda.beans.JodaBeanUtils; 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.writer.SheetWriter; import com.opengamma.master.portfolio.ManageablePortfolio; import com.opengamma.master.portfolio.ManageablePortfolioNode; 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; /** * Writes positions of a single security type to a single sheet */ public class SingleSheetSimplePositionWriter extends SingleSheetPositionWriter { private static final Logger s_logger = LoggerFactory.getLogger(SingleSheetSimplePositionWriter.class); private RowParser _rowParser; // current row context private Map<String, String> _currentRow = new HashMap<String, String>(); private ManageablePortfolioNode _currentNode; private ManageablePortfolio _portfolio; /** Generate one row per trade instead of one row per position */ private boolean _includeTrades; public SingleSheetSimplePositionWriter(SheetWriter sheet, RowParser rowParser, boolean includeTrades) { super(sheet); ArgumentChecker.notNull(rowParser, "rowParser"); _rowParser = rowParser; // create virtual manageable portfolio _currentNode = new ManageablePortfolioNode("Root"); _portfolio = new ManageablePortfolio("Portfolio", _currentNode); _currentNode.setPortfolioId(_portfolio.getUniqueId()); _includeTrades = includeTrades; } public SingleSheetSimplePositionWriter(SheetWriter sheet, RowParser rowParser) { this(sheet, rowParser, false); } public SingleSheetSimplePositionWriter(SheetWriter sheet, String securityType) { this(sheet, JodaBeanRowParser.newJodaBeanRowParser(securityType)); } public SingleSheetSimplePositionWriter(SheetFormat sheetFormat, OutputStream outputStream, RowParser rowParser) { this(SheetWriter.newSheetWriter(sheetFormat, outputStream, rowParser.getColumns()), rowParser); } public SingleSheetSimplePositionWriter(SheetFormat sheetFormat, OutputStream outputStream, RowParser rowParser, boolean includeTrades) { this(SheetWriter.newSheetWriter(sheetFormat, outputStream, rowParser.getColumns()), rowParser, includeTrades); } public SingleSheetSimplePositionWriter(String filename, RowParser rowParser) { this(SheetWriter.newSheetWriter(filename, rowParser.getColumns()), rowParser); } public SingleSheetSimplePositionWriter(String filename, RowParser rowParser, boolean includeTrades) { this(SheetWriter.newSheetWriter(filename, rowParser.getColumns()), rowParser, includeTrades); } public SingleSheetSimplePositionWriter(String filename, String securityType) { this(filename, JodaBeanRowParser.newJodaBeanRowParser(securityType)); } public SingleSheetSimplePositionWriter(String filename, String securityType, boolean includeTrades) { this(filename, JodaBeanRowParser.newJodaBeanRowParser(securityType), includeTrades); } public SingleSheetSimplePositionWriter(SheetFormat sheetFormat, OutputStream outputStream, String securityType) { this(sheetFormat, outputStream, JodaBeanRowParser.newJodaBeanRowParser(securityType)); } public SingleSheetSimplePositionWriter(SheetFormat sheetFormat, OutputStream outputStream, String securityType, boolean includeTrades) { this(sheetFormat, outputStream, JodaBeanRowParser.newJodaBeanRowParser(securityType), includeTrades); } @Override public void addAttribute(String key, String value) { // Not supported } @Override public ObjectsPair<ManageablePosition, ManageableSecurity[]> writePosition(ManageablePosition position, ManageableSecurity[] securities) { ArgumentChecker.notNull(position, "position"); ArgumentChecker.notNull(securities, "securities"); // Write securities _currentRow.putAll(_rowParser.constructRow(securities)); if (_includeTrades) { // Write each trade as a separate row if the current position contains trades if (position.getTrades().size() > 0) { ManageablePosition subPosition = JodaBeanUtils.clone(position); for (ManageableTrade trade : position.getTrades()) { Map<String, String> tempRow = new HashMap<>(); tempRow.putAll(_currentRow); tempRow.putAll(_rowParser.constructRow(trade)); // Set position quantity to its trade's quantity and write position subPosition.setQuantity(trade.getQuantity()); tempRow.putAll(_rowParser.constructRow(subPosition)); // Flush out the current row with trade if (!tempRow.isEmpty()) { getSheet().writeNextRow(tempRow); } } } else { // Write position _currentRow.putAll(_rowParser.constructRow(position)); // Flush out the current row (excluding trades) if (!_currentRow.isEmpty()) { getSheet().writeNextRow(_currentRow); } } } else { // Write position _currentRow.putAll(_rowParser.constructRow(position)); // Export only the first trade of each position or none at all if (!position.getTrades().isEmpty()) { _currentRow.putAll(_rowParser.constructRow(position.getTrades().get(0))); } if (position.getTrades().size() > 1) { s_logger.warn("Omitting extra trades: only one trade per position is supported in the current mode"); } if (!_currentRow.isEmpty()) { getSheet().writeNextRow(_currentRow); } } // Empty the current row buffer _currentRow = new HashMap<String, String>(); return ObjectsPair.of(position, securities); } @Override public String[] getCurrentPath() { return new String[] {}; } @Override public void setPath(String[] newPath) { // Nothing to do } }