/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.marketdata.manipulator.dsl;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.List;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.apache.commons.io.FilenameUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opengamma.component.tool.ToolUtils;
import com.opengamma.scripts.Scriptable;
/**
* <p>Tool for executing stand alone scenario scripts against a remote server.
* Invokes {@link StandAloneScenarioRunner#runScenarioScript}.</p>
*
* <p>Usage {@code stand-alone-scenario-tool.sh script}</p>
*/
@Scriptable
public class StandAloneScenarioTool {
private static final Logger s_logger = LoggerFactory.getLogger(StandAloneScenarioTool.class);
private static final Options OPTIONS = createOptions();
private static final String LOGBACK_CONFIG = "l";
private static final String SHORT_FORMAT = "s";
private static final String VERBOSE_OUTPUT = "v";
private static final String EXTENSION = ".txt";
public static void main(String[] args) throws IOException {
CommandLineParser parser = new PosixParser();
CommandLine commandLine;
try {
commandLine = parser.parse(OPTIONS, args);
} catch (final ParseException e) {
printUsage();
return;
}
if (commandLine.getArgList().size() == 0) {
System.out.println("Please specify a script file to execute");
printUsage();
return;
}
String logbackResource = commandLine.getOptionValue(LOGBACK_CONFIG, ToolUtils.getDefaultLogbackConfiguration());
ToolUtils.initLogback(logbackResource);
boolean verbose = commandLine.hasOption(VERBOSE_OUTPUT);
List<ScenarioResultModel> results;
File scriptFile;
try {
scriptFile = new File((String) commandLine.getArgList().get(0));
results = StandAloneScenarioRunner.runScenarioScript(scriptFile);
} catch (Exception e) {
if (verbose) {
s_logger.warn("Failed to run scenario script", e);
} else {
System.err.println("Failed to run scenario script. " + e.getMessage());
}
System.exit(1);
return;
}
String resultsFileRoot = FilenameUtils.removeExtension(scriptFile.getName()) + ".results";
File resultsFile = new File(resultsFileRoot + EXTENSION);
int fileSuffix = 1;
// generate a file name that doesn't exist
while (resultsFile.exists()) {
resultsFile = new File(resultsFileRoot + fileSuffix++ + EXTENSION);
}
try (Writer writer = new BufferedWriter(new FileWriter(resultsFile))) {
// default to long format, user has to specify short format if they want it
if (commandLine.hasOption(SHORT_FORMAT)) {
ScenarioResultsWriter.writeShortFormat(results, writer);
} else {
ScenarioResultsWriter.writeLongFormat(results, writer);
}
}
System.out.println("Successfully wrote scenario results to " + resultsFile.getAbsolutePath());
System.exit(0);
}
private static Options createOptions() {
Options options = new Options();
Option shortFormatOption = new Option(SHORT_FORMAT, "Outputs data in a shorter format");
options.addOption(shortFormatOption);
Option verboseOption = new Option(VERBOSE_OUTPUT, "Prints stack traces as well as error messages");
options.addOption(verboseOption);
Option logbackConfigOption = new Option(LOGBACK_CONFIG, true, "Logback config for the tool");
options.addOption(logbackConfigOption);
return options;
}
private static void printUsage() {
HelpFormatter formatter = new HelpFormatter();
formatter.setWidth(120);
formatter.printHelp("stand-alone-scenario-tool.sh <script>", OPTIONS, true);
}
// TODO options:
// output file?
// server location / config location?
}