/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.tool.portfolio;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Set;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import com.google.common.collect.ImmutableList;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.component.tool.AbstractTool;
import com.opengamma.core.position.Portfolio;
import com.opengamma.financial.tool.ToolContext;
import com.opengamma.integration.copier.portfolio.reader.PositionReader;
import com.opengamma.integration.copier.portfolio.reader.SingleSheetSimplePositionReader;
import com.opengamma.integration.copier.portfolio.reader.ZippedPositionReader;
import com.opengamma.integration.copier.sheet.SheetFormat;
import com.opengamma.integration.tool.portfolio.xml.SchemaRegister;
import com.opengamma.integration.tool.portfolio.xml.XmlFileReader;
import com.opengamma.master.security.ManageableSecurity;
import com.opengamma.scripts.Scriptable;
import com.opengamma.util.tuple.Pair;
/**
* The portfolio loader tool
*/
@Scriptable
public class PortfolioLoaderTool extends AbstractTool<ToolContext> {
/** File name option flag */
private static final String FILE_NAME_OPT = "f";
/** Portfolio name option flag*/
private static final String PORTFOLIO_NAME_OPT = "n";
/** Write option flag */
private static final String WRITE_OPT = "w";
/** Asset class flag */
private static final String SECURITY_TYPE_OPT = "s";
/**
* Main method to run the tool.
*
* @param args the standard tool arguments, not null
*/
public static void main(String[] args) { //CSIGNORE
new PortfolioLoaderTool().invokeAndTerminate(args);
}
/**
* Loads the portfolio into the position master.
*/
@Override
protected void doRun() {
String suggestedPortfolioName = getOptionValue(PORTFOLIO_NAME_OPT);
boolean write = getCommandLine().hasOption(WRITE_OPT);
if (write) {
System.out.println("Write option specified, will persist to portfolio '" + suggestedPortfolioName + "'");
} else {
System.out.println("Write option not specified, not persisting to OpenGamma masters");
}
PortfolioWriter persister = new PortfolioWriter(write,
getToolContext().getPortfolioMaster(),
getToolContext().getPositionMaster(),
getToolContext().getSecurityMaster());
final String filename = getOptionValue(FILE_NAME_OPT);
final String securityType = getOptionValue(SECURITY_TYPE_OPT);
for (PositionReader positionReader : constructPortfolioReaders(filename, securityType)) {
String name = positionReader.getPortfolioName();
String portfolioName = name != null ? name : suggestedPortfolioName;
PortfolioReader portfolioReader = new PortfolioReader(positionReader, portfolioName);
Pair<Portfolio, Set<ManageableSecurity>> pair = portfolioReader.createPortfolio();
persister.write(pair.getFirst(), pair.getSecond());
}
}
private String getOptionValue(String opt) {
return getCommandLine().getOptionValue(opt);
}
private Iterable<? extends PositionReader> constructPortfolioReaders(String filename, String securityType) {
switch (SheetFormat.of(filename)) {
case CSV:
// Fallthrough to XLS processing
case XLS:
// Check that the asset class was specified on the command line
if (securityType == null) {
throw new OpenGammaRuntimeException("Could not import as no asset class was specified for file " + filename);
} else {
// if (securityType.equalsIgnoreCase("exchangetraded")) {
// return new SingleSheetSimplePositionReader(filename, new ExchangeTradedRowParser(s_context.getBloombergSecuritySource()));
// } else {
return ImmutableList.of(new SingleSheetSimplePositionReader(filename, securityType));
// }
}
case XML:
// XMl multi-asset portfolio
try {
return new XmlFileReader(new FileInputStream(filename), new SchemaRegister());
} catch (FileNotFoundException e) {
throw new OpenGammaRuntimeException("Cannot find file: " + filename, e);
}
case ZIP:
// Create zipped multi-asset class loader
return ImmutableList.of(new ZippedPositionReader(filename, true));
default:
throw new OpenGammaRuntimeException("Input filename should end in .CSV, .XLS, .XML or .ZIP");
}
}
@Override
protected Options createOptions(boolean contextProvided) {
Options options = super.createOptions(contextProvided);
Option filenameOption = new Option(
FILE_NAME_OPT, "filename", true, "The path to the file containing data to import (CSV, XLS, XML or ZIP)");
filenameOption.setRequired(true);
options.addOption(filenameOption);
Option portfolioNameOption = new Option(
PORTFOLIO_NAME_OPT, "name", true, "The name of the destination OpenGamma portfolio");
options.addOption(portfolioNameOption);
Option writeOption = new Option(
WRITE_OPT, "write", false,
"Actually persists the portfolio to the database if specified, otherwise pretty-prints without persisting");
options.addOption(writeOption);
Option assetClassOption = new Option(
SECURITY_TYPE_OPT, "security", true,
"The security type expected in the input CSV/XLS file (ignored if ZIP file is specified)");
options.addOption(assetClassOption);
return options;
}
}