/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.tool.config;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.component.tool.AbstractTool;
import com.opengamma.core.config.impl.ConfigItem;
import com.opengamma.engine.marketdata.spec.HistoricalMarketDataSpecification;
import com.opengamma.engine.marketdata.spec.LiveMarketDataSpecification;
import com.opengamma.engine.marketdata.spec.MarketDataSpecification;
import com.opengamma.engine.view.ViewDefinition;
import com.opengamma.engine.view.execution.ExecutionOptions;
import com.opengamma.engine.view.execution.ViewExecutionFlags;
import com.opengamma.engine.view.impl.AutoStartViewDefinition;
import com.opengamma.financial.tool.ToolContext;
import com.opengamma.id.UniqueId;
import com.opengamma.id.VersionCorrection;
import com.opengamma.master.config.ConfigDocument;
import com.opengamma.master.config.ConfigMaster;
/**
* Simple tool for loading auto start view definitions. If the server is suitably
* configured then views will be automatically started when the engine starts.
*/
public class AutoStartViewLoaderTool extends AbstractTool<ToolContext> {
/**
* View definition command line option.
*/
private static final String VIEW_DEFINITION = "v";
/**
* Execution flags command line option.
*/
private static final String EXECUTION_FLAGS = "f";
/**
* Market data specs command line option.
*/
private static final String MARKET_DATA_SPECIFICATIONS = "m";
//-------------------------------------------------------------------------
/**
* Main method to run the tool.
*
* @param args the standard tool arguments, not null
*/
public static void main(String[] args) { //CSIGNORE
new AutoStartViewLoaderTool().invokeAndTerminate(args);
}
//-------------------------------------------------------------------------
@Override
protected void doRun() throws Exception {
String viewName = getCommandLine().getOptionValue(VIEW_DEFINITION);
UniqueId viewDefinitionId = lookupViewDefinition(viewName);
AutoStartViewDefinition viewDef = new AutoStartViewDefinition(
viewDefinitionId.toLatest(),
ExecutionOptions.infinite(parseMarketDataSpecifications(), parseExecutionFlags(), VersionCorrection.LATEST));
ConfigMaster configMaster = getToolContext().getConfigMaster();
configMaster.add(new ConfigDocument(ConfigItem.of(viewDef, viewName + " Auto Start")));
}
private List<MarketDataSpecification> parseMarketDataSpecifications() {
List<MarketDataSpecification> marketDataSpecifications = new ArrayList<>();
String[] values = getCommandLine().getOptionValues(MARKET_DATA_SPECIFICATIONS);
for (String value : values) {
marketDataSpecifications.add(parseMarketDataSpecification(value));
}
return marketDataSpecifications;
}
private MarketDataSpecification parseMarketDataSpecification(String value) {
// Format is expected to be Live:Activ,Snapshot:MySpecialSnap etc.
String[] parsed = value.split(":");
if (parsed.length != 2 || parsed[0].isEmpty() || parsed[1].isEmpty()) {
throw new OpenGammaRuntimeException("Unable to parse market data spec from [" + value +
"] - needs to be of the form <Type>:<Name> e.g. Live:Bloomberg");
}
switch (parsed[0].toUpperCase()) {
case "LIVE":
return LiveMarketDataSpecification.of(parsed[1]);
case "HISTORICAL":
return new HistoricalMarketDataSpecification(parsed[1]);
case "SNAPSHOT":
// To be implemented
default:
throw new OpenGammaRuntimeException("Unknown market data specification type: " + parsed[0]);
}
}
private EnumSet<ViewExecutionFlags> parseExecutionFlags() {
Set<ViewExecutionFlags> flags = new HashSet<>();
String[] values = getCommandLine().getOptionValues(EXECUTION_FLAGS);
for (String value : values) {
flags.add(ViewExecutionFlags.valueOf(value));
}
return EnumSet.copyOf(flags);
}
private UniqueId lookupViewDefinition(String viewName) {
return getToolContext().getConfigSource().getLatestByName(ViewDefinition.class, viewName).getUniqueId();
}
@Override
protected Options createOptions(boolean mandatoryConfigResource) {
Options options = super.createOptions(mandatoryConfigResource);
Option viewDefinitionOption = new Option(VIEW_DEFINITION, "viewDefinition", true, "View definition to be used");
viewDefinitionOption.setRequired(true);
options.addOption(viewDefinitionOption);
Option flagsOption = new Option(EXECUTION_FLAGS, "executionFlags", true, "Comma separated list of execution flags to be used");
flagsOption.setRequired(true);
flagsOption.setArgs(Option.UNLIMITED_VALUES);
flagsOption.setValueSeparator(',');
options.addOption(flagsOption);
Option marketDataOption = new Option(MARKET_DATA_SPECIFICATIONS, "marketDataSpecifications", true, "Comma separated list of market data specifications to be used");
marketDataOption.setRequired(true);
marketDataOption.setArgs(Option.UNLIMITED_VALUES);
marketDataOption.setValueSeparator(',');
options.addOption(marketDataOption);
return options;
}
}