Package com.opengamma.batch

Source Code of com.opengamma.batch.BatchJobRunner

/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.batch;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.threeten.bp.Instant;
import org.threeten.bp.LocalDate;
import org.threeten.bp.OffsetDateTime;
import org.threeten.bp.format.DateTimeFormatter;

import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.engine.marketdata.spec.HistoricalMarketDataSpecification;
import com.opengamma.engine.marketdata.spec.MarketData;
import com.opengamma.engine.view.ViewProcessor;
import com.opengamma.engine.view.client.ViewClient;
import com.opengamma.engine.view.execution.ExecutionOptions;
import com.opengamma.engine.view.execution.ViewExecutionOptions;
import com.opengamma.financial.view.rest.RemoteViewProcessor;
import com.opengamma.id.UniqueId;
import com.opengamma.livedata.UserPrincipal;
import com.opengamma.util.StartupUtils;
import com.opengamma.util.jms.JmsConnector;
import com.opengamma.util.jms.JmsConnectorFactoryBean;

/**
* The entry point for running OpenGamma batches.
*/
public class BatchJobRunner {

  /** Logger. */
  private static final Logger s_logger = LoggerFactory.getLogger(BatchJobRunner.class);
 
  static {
    StartupUtils.init();
  }

  /**
   * Date-time format: yyyyMMdd
   */
  private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");

  static LocalDate parseDate(String date) {
    return LocalDate.parse(date, DATE_FORMATTER);
  }

  static Instant parseTime(String date) {
    return OffsetDateTime.parse(date, DATE_FORMATTER).toInstant();
  }

  private static RunCreationMode getRunCreationMode(CommandLine line, Properties configProperties, String configPropertysFile) {
    String runCreationMode = getProperty("runCreationMode", line, configProperties, configPropertysFile, false);
    if (runCreationMode != null) {
      if (runCreationMode.equalsIgnoreCase("auto")) {
        return RunCreationMode.AUTO;
      } else if (runCreationMode.equalsIgnoreCase("create_new")) {
        return RunCreationMode.CREATE_NEW;
      } else if (runCreationMode.equalsIgnoreCase("create_new_overwrite")) {
        return RunCreationMode.CREATE_NEW_OVERWRITE;
      } else if (runCreationMode.equalsIgnoreCase("reuse_existing")) {
        return RunCreationMode.REUSE_EXISTING;
      } else {
        throw new OpenGammaRuntimeException("Unrecognized runCreationMode. " +
          "Should be one of AUTO, ALWAYS, NEVER. " +
          "Was " + runCreationMode);
      }
    } else {
      return null;
    }
  }

  private static LocalDate getObservationDate(CommandLine line, Properties configProperties, String configPropertysFile) {
    String observationDate = getProperty("observationDate", line, configProperties, configPropertysFile, false);
    if (observationDate != null) {
      return parseDate(observationDate);
    } else {
      return LocalDate.now();
    }
  }


  private static Instant getValuationTime(CommandLine line, Properties configProperties, String configPropertysFile) {
    String observationDate = getProperty("valuationTime", line, configProperties, configPropertysFile, false);
    if (observationDate != null) {
      return parseTime(observationDate);
    } else {
      return Instant.now();
    }
  }

  private static UniqueId getViewDefinitionUniqueId(CommandLine line, Properties configProperties) {
    String view = getProperty("view", line, configProperties);
    if (view != null) {
      return UniqueId.parse(view);
    } else {
      throw new IllegalArgumentException("View definition unique Id is mandatory parameter");
    }
  }

  /**
   * Creates an runs a batch job based on a properties file and configuration.
   */
  public static void main(String[] args) throws Exception // CSIGNORE
    if (args.length == 0) {
      usage();
      System.exit(-1);
    }
   
    CommandLine line = null;
    Properties configProperties = null;
   
    final String propertyFile = "batchJob.properties";

    String configPropertyFile = null;

    if (System.getProperty(propertyFile) != null) {
      configPropertyFile = System.getProperty(propertyFile);     
      try {
        FileInputStream fis = new FileInputStream(configPropertyFile);
        configProperties = new Properties();
        configProperties.load(fis);
        fis.close();
      } catch (FileNotFoundException e) {
        s_logger.error("The system cannot find " + configPropertyFile);
        System.exit(-1);
      }
    } else {
      try {
        FileInputStream fis = new FileInputStream(propertyFile);
        configProperties = new Properties();
        configProperties.load(fis);
        fis.close();
        configPropertyFile = propertyFile;
      } catch (FileNotFoundException e) {
        // there is no config file so we expect command line arguments
        try {
          CommandLineParser parser = new PosixParser();
          line = parser.parse(getOptions(), args);
        } catch (ParseException e2) {
          usage();
          System.exit(-1);
        }
      }
    }

    RunCreationMode runCreationMode = getRunCreationMode(line, configProperties, configPropertyFile);
    if (runCreationMode == null) {
      // default
      runCreationMode = RunCreationMode.AUTO;
    }

    String engineURI = getProperty("engineURI", line, configProperties, configPropertyFile);

    String brokerURL = getProperty("brokerURL", line, configProperties, configPropertyFile);

    Instant valuationTime = getValuationTime(line, configProperties, configPropertyFile);
    LocalDate observationDate = getObservationDate(line, configProperties, configPropertyFile);

    UniqueId viewDefinitionUniqueId = getViewDefinitionUniqueId(line, configProperties);

    URI vpBase;
    try {
      vpBase = new URI(engineURI);
    } catch (URISyntaxException ex) {
      throw new OpenGammaRuntimeException("Invalid URI", ex);
    }

    ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(brokerURL);
    activeMQConnectionFactory.setWatchTopicAdvisories(false);

    JmsConnectorFactoryBean jmsConnectorFactoryBean = new JmsConnectorFactoryBean();
    jmsConnectorFactoryBean.setConnectionFactory(activeMQConnectionFactory);
    jmsConnectorFactoryBean.setName("Masters");

    JmsConnector jmsConnector = jmsConnectorFactoryBean.getObjectCreating();
    ScheduledExecutorService heartbeatScheduler = Executors.newSingleThreadScheduledExecutor();
    try {
      ViewProcessor vp = new RemoteViewProcessor(
          vpBase,
          jmsConnector,
          heartbeatScheduler);
      ViewClient vc = vp.createViewClient(UserPrincipal.getLocalUser());

      HistoricalMarketDataSpecification marketDataSpecification = MarketData.historical(observationDate, null);

      ViewExecutionOptions executionOptions = ExecutionOptions.batch(valuationTime, marketDataSpecification, null);

      vc.attachToViewProcess(viewDefinitionUniqueId, executionOptions);
      vc.waitForCompletion();
    } finally {
      heartbeatScheduler.shutdown();
    }
  }

  private static String getProperty(String property, CommandLine line, Properties configProperties) {
    return getProperty(property, line, configProperties, null);
  }

  private static String getProperty(String propertyName, CommandLine line, Properties properties, String configPropertysFile) {
    return getProperty(propertyName, line, properties, configPropertysFile, true);
  }

  private static String getProperty(String propertyName, CommandLine line, Properties properties, String configPropertysFile, boolean required) {
    String optionValue = null;
    if (line != null) {
      optionValue = line.getOptionValue(propertyName);
      if (optionValue != null) {
        return optionValue;
      }
    }
    if (properties != null) {
      optionValue = properties.getProperty(propertyName);
      if (optionValue == null && required) {
        s_logger.error("Cannot find property " + propertyName + " in " + configPropertysFile);
        System.exit(-1);
      }
    } else {
      if (required) {
        s_logger.error("Cannot find option " + propertyName + " in command line arguments");
        System.exit(-1);
      }
    }
    return optionValue;
  }

  public static void usage() {
    HelpFormatter formatter = new HelpFormatter();
    formatter.printHelp("java [-DbatchJob.properties={property file}] com.opengamma.financial.batch.BatchJobRunner [options]", getOptions());
  }

  private static Options getOptions() {
    Options options = new Options();

    //options.addOption("reason", true, "Run reason. Default - Manual run started on {yyyy-MM-ddTHH:mm:ssZZ} by {user.name}.");

    //options.addOption("observationTime", true, "Observation time - for example, LDN_CLOSE. Default - " + BatchJobParameters.AD_HOC_OBSERVATION_TIME + ".");
    options.addOption("observationDate", true, "Observation date (= run date). yyyyMMdd - for example, 20100621. Default - system clock date.");

    options.addOption("valuationTime", true, "Valuation time. HH:mm[:ss] - for example, 16:22:09. Default - system clock.");

    options.addOption("view", true, "View name in configuration database. You must specify this.");

    options.addOption("engineURI", true, "URI to remote OG engine - for example 'http://localhost:8080/jax/components/ViewProcessor/main'. You must specify this.");
    options.addOption("brokerURL", true, "URL to activeMQ broker - for example 'tcp://localhost:61616'. You must specify this.");

    //options.addOption("viewTime", true, "Time at which view should be loaded. HH:mm[:ss]. Default - system clock.");
    //    options.addOption("snapshotObservationTime", true, "Observation time of LiveData snapshot to use - for example, LDN_CLOSE. Default - same as observationTime.");
    //    options.addOption("snapshotObservationDate", true, "Observation date of LiveData snapshot to use. yyyyMMdd. Default - same as observationDate");

    options.addOption("runCreationMode", true, "One of auto, create_new, create_new_overwrite, reuse_existing (case insensitive)." +
      " Specifies whether to create a new run in the database." +
      " See documentation of RunCreationMode Java enum to find out more. Default - auto.");


    //options.addOption("timeZone", true, "Time zone in which times on the command line are given. Default - system time zone.");

    return options;
  }

}
TOP

Related Classes of com.opengamma.batch.BatchJobRunner

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.